
これは私が使用するファイルシステムによって異なりますか?たとえば、ext2/ext3/ext4ですが、ISO 9660を含む「joliet」CD-ROMを挿入するとどうなりますか? POSIXには、一種のファイル名文字セットエンコーディング仕様が含まれていると聞きました。
本質的に私が知りたいのは、UTF-8でエンコードされたファイル名を取得した場合、それをLinuxのファイルI / O APIに渡す前にどのような処理/変換を実行する必要がありますか?
答え1
他の人が指摘したように、これに対する実際の答えはありません。ファイル名とパスはエンコードされません。オペレーティングシステムはバイトシーケンスのみを処理します。個々のアプリケーションは特定の方法でエンコードされたと解釈することを選択できますが、これはさまざまです。
特に、Glib(Gtk +アプリケーションで使用)すべてのファイル名は、ユーザーのロケールに関係なくUTF-8でエンコードされていると想定されます。。これは環境変数によってオーバーライドできます。G_FILENAME_ENCODINGそしてG_BROKEN_FILENAMES。
一方、Qtはデフォルトとしてすべてのファイル名が現在ユーザーのロケールでエンコードされているとします。。個々のアプリケーションはこの仮定を上書きすることを選択できますが、そうすることはなく、外部上書きスイッチもありません。
最新のLinuxディストリビューションは、すべてのユーザーがUTF-8ロケールを使用し、外部ファイルシステムマウントのパスがUTF-8に変換されるように設定されているため、これらのポリシーの違いは通常何の影響もありません。しかし、本当に安全が必要な場合は、「NULで終了して'/'で区切られたバイトシーケンス」以外のファイル名構造を想定することはできません。
(また、注:ロケールはプロセスごとに異なる場合があります。同じユーザーが実行する2つの異なるプロセスは、異なる環境変数を設定するだけで異なるロケールに存在する可能性があります。)
答え2
Linux の unix/posix 階層は、どのエンコーディングを使用するかは関係ありません。現在エンコードされているバイトシーケンスをそのまま保存します。
これらのマウントオプションは、特定のファイルシステムの定義された文字セットをシステム文字セットに変換するのに役立ちます。 (CDROM、NTFS、およびFATバリアントはいくつかのUnicodeバリアントを使用します)。
私はUnixがシステムグローバルエンコーディングを定義すると期待していましたが、実際にはユーザー固有の設定です。したがって、同僚と異なるエンコーディングを定義すると、ファイル名が異なるように表示されます。
答え3
ファイルシステムをどのようにマウントしたかによって異なります。man mount
.exampleiso9660
を見るとvfat
オプションがfat
あります。iocharset
utf8