
Windows間にはファイル交換作業が多いので(GBKエンコード)とLinux(UTF-8エンコード) 次のような文字エンコーディングの問題が発生しやすくなります。
- Windowsシステムではzip / tarファイル名に漢字が含まれており、Linuxシステムでは/ untarを解凍します。
- 移行された従来のJava Webアプリケーション(JSPはGBKエンコーディングを使用してWindowsシステムで設計されています)を実行し、GBKエンコードされた名前付きファイルをディスクに書き込みます。
- ftp Windows FTPサーバーとLinuxクライアントの間でGBKでエンコードされた名前付きファイルをインポートまたは挿入します。
- LinuxでLANG環境を切り替えます。
前述の一般的な問題は、ファイルの場所/名前の指定です。グーグルの後に記事を手に入れた。LinuxでUnicodeを使用する https://www.linux.com/news/using-unicode-linux/、それは言う:
オペレーティングシステムと多くのユーティリティは、ファイル名のバイトがどの文字を表すのかわかりません。
したがって、同じ名前の2つのファイルがある可能性があります(同じ名前が正しい文字セットにデコードされたときその他(バイト単位)、例えば中文.txt
符号化が異なる。
[root@fedora test]# ls
???? 中文
[root@fedora test]# ls | iconv -f GBK
中文
涓iconv: illegal input sequence at position 7
[root@fedora test]# ls 中文 && ls $'\xd6\xd0\xce\xc4' | iconv -f gbk
中文
中文
質問:
- 固定文字エンコード(例:NTFSUTF-16は、LANG / LC_ALL環境に関係なくファイル名を格納するために内部的に使用されますか?
- それとも私が本当に尋ねたいのは、
$'\xe4\xb8\xad\xe6\x96\x87.txt'
ファイル名がzh_CN.UTF-8環境ではChinese.txt()、$'\xd6\xd0\xce\xc4.txt'
zh_CN.GBK環境ではChinese.txt()になることができますか?同じファイル参照? - 設定できない場合は、カーネルにパッチを適用してファイルシステムと現在の環境間の文字エンコーディングを変換できますか(実装要求ではなく質問のみ)可能であればパフォーマンスにどのような影響を与えますか?
答え1
あなたの質問を順番に読んだら、明らかな理由で質問を少し異なって表現しました。
1. LANG / LC_ALL環境に関係なく、ファイル名を保存するために固定文字エンコーディングを使用するようにLinuxファイルシステムを構成できますか?
いいえ、できません。質問で述べたように、UNIXファイル名は一連のバイトです。カーネルはエンコードについて何も知らず、完全にユーザースペース(アプリケーションレベルなど)の概念です。
つまり、カーネルはLANG
/について何も知らないので、LC_*
これを翻訳することはできません。
2. 同じファイルを別のファイル名で参照することは可能ですか?
同じファイルを参照する複数のディレクトリエントリを持つことができます。ハードリンクまたはシンボリックリンク。
ただし、現在のエンコーディングで無効なファイル名(UTF-8ロケールで作業しているときのGBK文字列)は正しく表示されません(まったく存在しない場合)。
3.ファイルシステムと現在の環境との間の文字エンコーディングを変換するためにカーネルをパッチすることはできますか?
君はパッチできないコアこれを行うには(1を参照)、理論的にはCライブラリ(glibcなど)にパッチを適用してこの変換を実行し、カーネルを呼び出すときは常にファイル名をUTF-8に変換してからカーネルから再変換できます。ファイル名を読み取るときのエンコーディング。
より簡単なアプローチは、オーバーレイファイルシステムを作成することです。ヒューズ、ファイル名をUTF-8に変換し、ファイルシステム要求を別の場所にリダイレクトします。理想的には、このファイルシステムをマウントでき、~/trans
アクセスすると
~/trans/a/GBK/encoded/path
FUSEファイルシステムが実際にアクセスされます
/a/UTF-8/encoded/path
。
しかし、これらの方法の問題は、ファイルシステムにすでに存在しているがUTF-8でエンコードされていないファイルをどのように処理するかです。翻訳されていない状態で渡すことはできません。これは変換方法がわからないからです。無効な文字シーケンスを変換して破損することはありません。?
衝突が発生する可能性があるためです。
答え2
あなたができることは、サポートされているロケールの数をUTF-8ロケールに限定することです。
http://www.fifi.org/cgi-bin/man2html/usr/share/man/man5/locale.gen.5
答え3
バニラunzipとバニラp7zipの両方でOEMコードページの選択が中断されました。私はそうだった斑点この問題を解決し、Ubuntu用ppaこのパッチが適用されたp7zipを使用してください。
答え4
zipのこの問題は次のとおりです。安定最近はFar2lファイルとアーカイブマネージャ。 Far2lの以前のzip文字セット検出が正しく機能するためには、システム言語設定は、アーカイブが生成されたシステムで設定された言語設定と一致する必要があります(Windowsの内部「zipフォルダ」ツールは同じロジックを使用します)。あなたもできます。
LANG=zh_CN.UTF-8 far2l