web-dev-qa-db-ja.com

Linuxでファイル名とパスに使用される文字セットエンコーディングは何ですか?

使用しているファイルシステムに依存しますか?たとえば、ext2/ext3/ext4だけでなく、ISO 9660の「ジョリエット」CD-ROMを挿入するとどうなりますか? POSIXにファイル名の文字セットエンコーディングのある種の仕様が含まれていると聞いたことがありますか?

基本的に、UTF-8でエンコードされたファイル名を取得した場合、LinuxのファイルI/O APIに渡す前に、どのような処理/変換を行う必要があるのでしょうか。

47
martin

他の人が指摘したように、これに対する答えは実際にはありません。ファイル名とパスにはエンコードがありません。 OSはバイトシーケンスのみを扱います。個々のアプリケーションはそれらを何らかの方法でエンコードされていると解釈することを選択できますが、これは異なります。

具体的には、Glib(Gtk +アプリで使用) ユーザーのロケールに関係なく、すべてのファイル名がUTF-8でエンコードされていると想定 。これは、環境変数 G_FILENAME_ENCODING および G_BROKEN_FILENAMES でオーバーライドできます。

一方、Qtのデフォルトは すべてのファイル名が現在のユーザーのロケールでエンコードされていると想定 です。個々のアプリケーションがこの仮定をオーバーライドすることを選択する可能性がありますが、私はその仮定をオーバーライドしていないため、外部オーバーライドスイッチはありません。

最新のLinuxディストリビューションは、すべてのユーザーがUTF-8ロケールを使用し、外部ファイルシステムマウントのパスがUTF-8に変換されるように設定されているため、この戦略の違いは通常影響しません。ただし、本当に安全にしたい場合は、「NULで終了し、「/」で区切られたバイトのシーケンス」を超えるファイル名に関する構造を想定することはできません。

(また、ロケールはプロセスによって異なる場合があります。同じユーザーが実行する2つの異なるプロセスは、異なる環境変数を設定するだけで、異なるロケールになる場合があります。)

50
ephemient

Linuxのunix/posixレイヤーは、どのエンコーディングを使用してもかまいません。現在のエンコーディングのバイトシーケンスをそのまま保存します。

これらのマウントオプションは、文字セットを定義する特定のファイルシステムをシステムの文字セットに変換するのに役立つと思います。 (CDROM、NTFS、およびFATバリアントは、いくつかのUnicodeバリアントを使用します)。

UNIXでシステムのグローバルエンコーディングを定義したいのですが、実際にはユーザーごとの設定です。したがって、別のエンコーディングを定義してから同僚を定義すると、ファイル名の表示が異なります。

11
Bert Huijben

これは、ファイルシステムのマウント方法によって異なります。man mountのさまざまなファイルシステムのマウントオプションを確認してください。たとえば、iso9660vfatおよびfatには、iocharsetおよびutf8オプションがあります。

5
Adam Byrtek