順番に読んでいただくと理由が明らかになるはずです。
1. LANG/LC_ALL 環境に関係なく、固定文字エンコーディングを使用してファイル名を保存するように Linux ファイルシステムを構成することは可能ですか?
いいえ、これは不可能です。質問で述べたように、UNIX ファイル名は単なる一連のバイトです。カーネルは、完全にユーザー空間 (つまり、アプリケーションレベル) の概念であるエンコーディングについて何も知りません。
つまり、カーネルは LANG
について何も知りません。 /LC_*
であるため、翻訳できません。
2.異なるファイル名で同じファイルを参照することはできますか?
同じファイルを参照する複数のディレクトリ エントリを持つことができます。ハード リンクまたはシンボリック リンクを介して作成できます。
ただし、現在のエンコーディングで有効でないファイル名 (たとえば、UTF-8 ロケールで作業している場合の GBK 文字列) は、表示されたとしても正しく表示されないことに注意してください。
3.カーネルにパッチを適用して、ファイル システムと現在の環境の間で文字エンコーディングを変換することはできますか?
カーネルにパッチを当てることはできません これを行うには (1. を参照)、理論的には C ライブラリ (glibc など) にパッチを適用してこの変換を実行し、カーネルを呼び出すときに常にファイル名を UTF-8 に変換し、それらを現在の形式に戻すことができます。カーネルからファイル名を読み取るときのエンコーディング
より簡単な方法は、FUSE を使用してオーバーレイ ファイルシステムを作成することです。これは、ファイル名を UTF-8 との間で変換した後、任意のファイル システム要求を別の場所にリダイレクトするだけです。理想的には、このファイルシステムを ~/trans
にマウントできます 、および ~/trans/a/GBK/encoded/path
へのアクセスが行われたとき 次に、FUSE ファイルシステムは実際に /a/UTF-8/encoded/path
にアクセスします .
ただし、これらのアプローチの問題点は、ファイル システムに既に存在し、UTF-8 でエンコードされていないファイルをどうするかということです。単に翻訳せずにそのまま渡すことはできません。変換方法がわからないからです。無効な文字シーケンスを ?
に変換してそれらを台無しにすることはできません 競合が発生する可能性があるため...