web-dev-qa-db-ja.com

Linuxでのファイルシステムの文字エンコーディングに関するいくつかの質問

Windows( [〜#〜] gbk [〜#〜] エンコーディング)とLinux( TF-8 エンコーディング)の間で多くのファイル交換が行われるため、次のような文字エンコーディングの問題が簡単に発生します。

  • Windowsシステムでは名前に漢字が含まれるZip/tarファイル、Linuxシステムではunzip/untar。
  • 移行されたレガシーJava Webアプリケーション(Windowsシステムで設計され、JSPでGBKエンコーディングを使用)を実行し、GBKエンコーディングで指定されたファイルをディスクに書き込みます。
  • ftp get/putGBKエンコーディング-WindowsFTPサーバーとLinuxクライアント間の名前付きファイル。
  • linuxでLANG環境を切り替えます。

前述の一般的な問題は、ファイルの検索/名前付けです。グーグルした後、私は記事を手に入れました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
中文
中文

質問:

  1. LinuxファイルシステムがLANG/LC_ALL環境に関係なくファイル名を保存するために固定文字エンコーディング( [〜#〜] ntfs [〜#〜] UTF-16を内部で使用するなど)を使用するように構成できますか?
  2. または、実際に質問したいのは、ファイル名を中文.txt($'\xe4\xb8\xad\xe6\x96\x87.txt')zh_CN.UTF-8環境およびファイル名中文.txt($'\xd6\xd0\xce\xc4.txt')zh_CN.GBK環境で同じファイルを参照
  3. 構成できない場合、ファイルシステムと現在の環境の間で文字エンコーディングを変換するようにカーネルにパッチを適用することは可能ですか?可能であれば、パフォーマンスはどの程度影響しますか?
12
LiuYan 刘研

質問を順番に読んだときに明白に見えるはずの理由により、私はあなたの質問を少し再構成しました。

1. LANG/LC_ALL環境に関係なく、Linuxファイルシステムが固定文字エンコーディングを使用してファイル名を保存するように設定することはできますか?

いいえ、これは不可能です。質問で述べたように、UNIXファイル名は単なるバイトのシーケンスです。カーネルはエンコーディングについて何も知りません。エンコーディングは完全にユーザースペース(つまり、アプリケーションレベル)の概念です。

言い換えると、カーネルはLANG/LC_*について何も知らないため、変換できません。

2.異なるフ​​ァイル名で同じファイルを参照させることはできますか?

同じファイルを参照する複数のディレクトリエントリを持つことができます。 ハードリンク または シンボリックリンク で作成できます。

ただし、現在のエンコーディングで無効なファイル名(UTF-8ロケールで作業している場合のGBK文字列など)は、表示されたとしても、表示が悪くなることに注意してください。

3.カーネルにパッチを適用して、ファイルシステムと現在の環境の間で文字エンコードを変換することは可能ですか?

これを行うために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エンコードされていないファイルをどうするかです。それらを変換せずに単に渡すことはできません。変換する方法がわからないためです。無効な文字シーケンスを?に変換してそれらをマングルすることはできません。競合が発生する可能性があるためです...

8
Riccardo Murri

できることは、サポートされるロケールの数をUTF-8ロケールのみに制限することです。

http://www.fifi.org/cgi-bin/man2html/usr/share/man/man5/locale.gen.5

1
Šimon Tóth