Windows( [〜#〜] gbk [〜#〜] エンコーディング)とLinux( TF-8 エンコーディング)の間で多くのファイル交換が行われるため、次のような文字エンコーディングの問題が簡単に発生します。
前述の一般的な問題は、ファイルの検索/名前付けです。グーグルした後、私は記事を手に入れましたLinuxでUnicodeを使用するhttp://www.linux.com/archive/feed/39912 =、それは言った:
オペレーティングシステムと多くのユーティリティは、ファイル名のバイトが何文字を表すかを認識していません。
したがって、エンコードが異なる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
中文
中文
質問:
$'\xe4\xb8\xad\xe6\x96\x87.txt'
)zh_CN.UTF-8環境およびファイル名中文.txt($'\xd6\xd0\xce\xc4.txt'
)zh_CN.GBK環境で同じファイルを参照?質問を順番に読んだときに明白に見えるはずの理由により、私はあなたの質問を少し再構成しました。
いいえ、これは不可能です。質問で述べたように、UNIXファイル名は単なるバイトのシーケンスです。カーネルはエンコーディングについて何も知りません。エンコーディングは完全にユーザースペース(つまり、アプリケーションレベル)の概念です。
言い換えると、カーネルはLANG
/LC_*
について何も知らないため、変換できません。
同じファイルを参照する複数のディレクトリエントリを持つことができます。 ハードリンク または シンボリックリンク で作成できます。
ただし、現在のエンコーディングで無効なファイル名(UTF-8ロケールで作業している場合のGBK文字列など)は、表示されたとしても、表示が悪くなることに注意してください。
これを行うためにkernelにパッチを適用することはできません(1を参照)が、理論的にはCライブラリ(例:glibc)にパッチを適用して実行することはできます。この変換では、カーネルを呼び出すときに常にファイル名をUTF-8に変換し、カーネルからファイル名を読み取るときに現在のエンコーディングに変換し直します。
より簡単なアプローチは、ファイル名をUTF-8に変換したり、UTF-8から変換したりした後、ファイルシステム要求を別の場所にリダイレクトするだけのオーバーレイファイルシステムを Fuse で書き込むことです。理想的には、このファイルシステムを~/trans
にマウントし、~/trans/a/GBK/encoded/path
にアクセスすると、Fuseファイルシステムは実際に/a/UTF-8/encoded/path
にアクセスします。
ただし、これらのアプローチの問題は、ファイルシステムにすでに存在し、UTF-8エンコードされていないファイルをどうするかです。それらを変換せずに単に渡すことはできません。変換する方法がわからないためです。無効な文字シーケンスを?
に変換してそれらをマングルすることはできません。競合が発生する可能性があるためです...
できることは、サポートされるロケールの数をUTF-8ロケールのみに制限することです。
http://www.fifi.org/cgi-bin/man2html/usr/share/man/man5/locale.gen.5