ファイル名のエンコーディングがどのように機能するかを理解するのが困難です。 unix.SEで矛盾する説明が見つかりました。
文字で保存されたファイル名
他の答えを引用するには: Linuxのファイルシステム文字エンコーディングに関するいくつかの質問
[...]あなたの質問で述べたように、UNIXファイル名は単なる文字列であり、カーネルはエンコードについて全く知らず、完全にユーザースペース(アプリケーションレベル)の概念です。
ファイル名が文字として保存されている場合、最終ファイル名はディスクにビットまたはバイトのシーケンスとして表示される必要があるため、一部のエンコーディングを含める必要があります。ユーザーが選択できる場合どのエンコーディングは、文字をカーネルに供給されるバイトシーケンスにマッピングして生成できます。どの有効なファイル名の一連のバイトです。
以下を想定します。ユーザーはランダムエンコーディングを使用します。X、ファイルをfoo
一連のバイトに変換します。αそしてディスクに保存します。他のユーザーがエンコードを使用します。はい。このエンコーディングではαに変換します/
。ファイル名として使用できません。ただし、最初のユーザーの場合、ファイルは有効です。
私はこれが起こるとは思わない。
バイナリブロブとして保存されたファイル名
他の答えを引用するには: Linuxでは、ファイル名とパスにどの文字セットエンコーディングが使用されますか?
他の人が指摘したように、これに対する実際の答えはありません。ファイル名とパスはエンコードされません。オペレーティングシステムはバイトシーケンスのみを処理します。個々のアプリケーションは特定の方法でエンコードされたと解釈することを選択できますが、これはさまざまです。
システムが文字を処理しない場合、ファイル名の特定の文字(/
または)を抑制するにはどうすればよいですか?コーディングがなければ、NULL
aの概念もありません。/
1つの説明は、ファイルシステムが以下を含むファイル名を保存できることです。どの
文字がある場合は、エンコードを検討しているユーザープログラムのみが、無効な文字を含むファイル名をブロックします。これは、最終的にファイルシステムとカーネルが問題なく包含を処理できることを意味します/
。
私もこれが間違っていると思います。
エンコーディングはどこで行われ、特定の文字を許可しない制限はどこにありますか?
ベストアンサー1
短い答え:namei()
Unix / Linux / BSDカーネル機能に課される制限です。エンコードは、または同じユーザーレベルのプログラムで発生しますxterm
。firefox
ls
私はあなたが間違った前提から始めていると思います。 Unixのファイル名は、任意の値を持つバイト文字列です。一部の値、0x0(ASCII Nul)、および0x2f(ASCII '/')は、マルチバイト文字エンコーディングの一部として許可されていません。 「バイト」には文字を表す数値(ASCIIやその他のエンコード)を含めることができますが、「文字」には1バイト以上が必要になる場合があります(UnicodeのUTF-8表現では0x7f以上のコードポイントなど)。
これらの制限は、ファイル名の印刷規則とASCII文字セットが原因で発生します。元のUnixでは、ASCII '/'(数値0x2f)の値バイトを使用して部分パスまたはフルパスの断片を分離しました(例: '/usr/bin/cat'では 'usr'、 'bin'、および 'cat'フラグメントあり)。もともとUnixでは、文字列を終了するためにASCII Nulを使用しました。これら2つの値に加えて、ファイル名のバイトは異なる値を持つことができます。 UnicodeのUTF-8エンコーディングでこれを確認できます。印刷可能なASCII文字( "/"を含む)はUTF-8で1バイトしか占めません。上記のコードポイントのUTF-8には、Nul制御文字を除いて値が0のバイトは含まれていません。 UTF-8はUnixの王座を狙うPlan-9のために発明されました。
以前のUnix(Linuxのように見えます)には、namei()
パスを一度に1バイトずつ調べて、0x2F値バイトからパスをフラグメントに分割し、値が0のバイトで停止する機能がありました。 namei()
Unix/Linux/BSD カーネルの一部なので、例外バイト値が適用される場所です。
これまで、文字ではなくバイト値について説明しました。 namei()
バイトには文字セマンティクスは適用されません。これはls
、たとえば、バイト値または文字値に基づいてファイル名をソートできるユーザーレベルのプログラムによって異なります。xterm
ファイル名で点灯するピクセルは、文字エンコーディングによって決まります。 UTF-8でエンコードされたファイル名があることを教えてくれない場合は、xterm
呼び出し時に横たわる言葉がたくさん表示されます。 UTF-8(またはすべてのUTF-16、UTF-32)エンコードを検出するようにコンパイルされていない場合、vim
UTF-8でエンコードされた文字を含む「テキストファイル」を開くと、多くの横説説が表示されます。