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


12

Windows(GBKエンコーディング)とLinux(UTF-8エンコーディング)の間で多くのファイル交換が機能するため、次のような文字エンコーディングの問題が簡単に発生します。

  • Windowsシステムでは中国語の文字を含む名前のzip / tarファイル、Linuxシステムではunzip / untar。
  • GBK-encoding-namedファイルをディスクに書き込む移行済みのレガシーJava Webアプリケーション(JSPでGBKエンコーディングを使用してWindowsシステムで設計)を実行します。
  • ftpは、Windows FTPサーバーとLinuxクライアント間のGBKエンコード名ファイルを取得/配置します。
  • LinuxでLANG環境を切り替えます。

前述の一般的な問題は、ファイルの検索/命名です。グーグルで検索した後、Linux http://www.linux.com/archive/feed/39912でのUnicodeの使用に関する記事受け取りました。

オペレーティングシステムと多くのユーティリティは、ファイル名のバイトが表す文字を認識しません。

したがって、異なるエンコーディングの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. LANG / LC_ALL環境に関係なく、ファイル名を保存するために、Linuxファイルシステムが固定文字エンコードを使用するように構成することは可能ですか(NTFSは内部でUTF-16を使用するように)?
  2. または、私が実際に尋ねたいのは$'\xe4\xb8\xad\xe6\x96\x87.txt'、zh_CN.UTF-8環境のファイル名中文.txt($'\xd6\xd0\xce\xc4.txt')とzh_CN.GBK環境のファイル名中文.txt()に同じファイルを参照させることは可能ですか?
  3. 構成できない場合、ファイルシステムと現在の環境の間で文字エンコーディングを変換するためにカーネルにパッチを適用することは可能ですか?可能な場合、パフォーマンスはどの程度影響しますか?

ファイルシステムのUTF-16エンコーディングとロケール設定で指定されたエンコーディングを自動的に変換するCygwin 1.7を使用して、Windows側から問題に取り組むことができます。デフォルトはUTF-8であるため、たとえばCygwin tarはファイル名をUTF-8としてエンコードします。
ak2

@ ak2ありがとう、Cygwinは本当に良いです、私は何年も使ってきました。tar / zipケースは単なる例であり、実際の環境では、zip / tarファイルは他の人が作成する場合があります(インターネットからファイルをダウンロードするなど)。
LiuYan刘研

回答:


8

あなたが質問を順番に読んだときに明白になるはずの理由のために、私はあなたの質問を少し改定しました。

1. LANG / LC_ALL環境に関係なく、ファイル名を保存するために固定文字エンコードを使用するLinuxファイルシステムを構成することは可能ですか?

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

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

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

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

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

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

カーネルにパッチを当ててこれを行うことはできませんが(1を参照)、理論的にはCライブラリ(たとえばglibc)にパッチを当ててこの変換を実行し、カーネルを呼び出すときに常にファイル名をUTF-8に変換できます。カーネルからファイル名を読み取るときに、それらを現在のエンコードに変換します。

より簡単な方法は、ファイル名をUTF-8に変換した後、UTF-8に変換した後、ファイルシステム要求を別の場所にリダイレクトするFUSEでオーバーレイファイルシステムを作成することです。理想的には~/trans、このファイルシステムをマウントでき~/trans/a/GBK/encoded/path、FUSEファイルシステムが実際にアクセスする ときにアクセスできます /a/UTF-8/encoded/path

ただし、これらのアプローチの問題は、ファイルシステムに既に存在し、UTF-8エンコードされていないファイルをどうするかということです。単純に変換せずに渡すことはできません。変換方法がわからないためです。無効な文字シーケンスを変換して、?競合を引き起こす可能性があるため、それらをマングルすることはできません...


4
そのようなオーバーレイファイルシステムが存在します:Convmvfs
ジル 'SO-悪である停止

1

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

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


2
個人的には、世界で文字セットエンコーディング(UTF-8)が1つしかないことを願っていますが、レガシーアプリケーションはまだ実行されており、WindowsとLinuxの間の相互運用性を実現する必要があり、ほとんどの人はこの悪夢に直面しなければなりません。
LiuYan刘研
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.