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


45

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

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


以下の回答は、OSとファイルシステムはエンコーディングを気にしないと言っています。HFS +などの一部のファイルシステムは、非常に重要です。HFS +にはUTF-8が必要で、これは内部的にUTF-16の制限された方言に変換されます。NTFSにも同様の問題がありますが、詳細については明確ではありません。
zmccord

HFS +では、名前を分解する必要もありますが、これは、事前構成されたlinuxを使用する傾向にうまく対応していません。web.archive.org/web/20080518105836/http://developer.apple.com/…–
user12439

回答:


49

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

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

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

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

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


1
「NUL終了、 '/'で区切られたバイトシーケンス」しかし、エンコーディングなしで、どのバイトが '/'を表すかをどのように知るのでしょうか。
ジャック

1
@Jackは常に'\x2F'、どのようなものかに関係なく/。SJISで大きく異なります。
一時的な

1
あ、そう。その情報で回答を更新することを検討しますか?たぶん、私が最近文字セット変換ライブラリに取り組んだからかもしれませんが、「 '/'で区切られたバイトのシーケンス」というフレーズは意味がありません。
ジャック

では、HEXのSSHセッションでファイル名のバイトを表示する方法は?
DIMS

11

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

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

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


それでは、ユーザーが現在使用しているロケールを確認し、Nautilusなどでファイル名が正しく表示されるように新しいファイルのロケールに変換する必要があります。
マーティン

1
それもその単純ではない@martin ...異なるプロセスは、ENV変数とそれがで書かれた言語に応じて、異なるエンコーディングを使用することができます。
基本

5

ファイルシステムのマウント方法によって異なりますman mount。異なるファイルシステムのマウントオプションを参照してください。たとえばiso9660vfatおよびfathave iocharsetおよびutf8options。


utf8を使用してマウントする場合、utf8もopen()システムコールに渡す必要がありますか?
マーティン

また、私はこれを見つけました(library.gnome.org/devel/glib/unstable/…)これは、ファイル名の文字セットエンコーディングが設定されているロケールに依存していることを示しているようですか?
マーティン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.