使用するファイルシステムに依存しますか?たとえば、ext2 / ext3 / ext4だけでなく、ISO 9660の「ジョリエット」CD-ROMの1つを挿入するとどうなりますか?POSIXには、ファイル名の文字セットエンコーディングに関する何らかの仕様が含まれていると聞きましたか?
基本的に、UTF-8でエンコードされたファイル名を取得した場合、LinuxのファイルI / O APIに渡す前にどのような処理/変換が必要ですか?
使用するファイルシステムに依存しますか?たとえば、ext2 / ext3 / ext4だけでなく、ISO 9660の「ジョリエット」CD-ROMの1つを挿入するとどうなりますか?POSIXには、ファイル名の文字セットエンコーディングに関する何らかの仕様が含まれていると聞きましたか?
基本的に、UTF-8でエンコードされたファイル名を取得した場合、LinuxのファイルI / O APIに渡す前にどのような処理/変換が必要ですか?
回答:
他の人が述べたように、これに対する答えは実際にはありません。ファイル名とパスにはエンコードがありません。OSはバイトシーケンスのみを処理します。個々のアプリケーションは、何らかの方法でエンコードされていると解釈することを選択できますが、これは異なります。
具体的には、Glib(Gtk +アプリで使用)は、ユーザーのロケールに関係なく、すべてのファイル名がUTF-8でエンコードされていることを前提としています。これは、環境変数G_FILENAME_ENCODINGおよびG_BROKEN_FILENAMESでオーバーライドできます。
一方、Qtはデフォルトで、すべてのファイル名が現在のユーザーのロケールでエンコードされていると仮定します。個々のアプリケーションは、この仮定をオーバーライドすることを選択する場合がありますが、それを知ることはできません。また、外部オーバーライドスイッチはありません。
最新のLinuxディストリビューションは、すべてのユーザーがUTF-8ロケールを使用し、外部ファイルシステムマウントのパスがUTF-8に変換されるように設定されているため、この戦略の違いは一般に効果がありません。ただし、本当に安全にしたい場合は、「NULで終了する、 '/'で区切られたバイトシーケンス」を超えるファイル名に関する構造を想定することはできません。
(注意:ロケールはプロセスによって異なる場合があります。同じユーザーが実行する2つの異なるプロセスは、異なる環境変数を設定するだけで異なるロケールにある場合があります。)
'\x2F'
、どのようなものかに関係なく/
。SJISで大きく異なります。
Linuxのunix / posixレイヤーは、どのエンコーディングを使用してもかまいません。現在のエンコーディングのバイトシーケンスをそのまま保存します。
これらのマウントオプションは、文字セットを定義する特定のファイルシステムをシステムの文字セットに変換するのに役立つと思います。(CDROM、NTFS、およびFATバリアントはいくつかのUnicodeバリアントを使用します)。
UNIXでシステムのグローバルエンコーディングを定義したいのですが、実際にはユーザーごとの設定です。そのため、同僚と異なるエンコーディングを定義すると、ファイル名が異なって表示されます。
ファイルシステムのマウント方法によって異なりますman mount
。異なるファイルシステムのマウントオプションを参照してください。たとえばiso9660
、vfat
およびfat
have iocharset
およびutf8
options。