ファイル名のエンコードがどのように機能するかを理解するのに苦労しています。unix.SEには矛盾する説明があります。
ファイル名は文字として保存されます
別の答えを引用するには: Linuxでのファイルシステムの文字エンコーディングに関するいくつかの質問
[…]質問で述べたように、UNIXファイル名は単なる文字列です。カーネルはエンコードについて何も知りません。これは完全にユーザー空間(つまり、アプリケーションレベル)の概念です。
ファイル名が文字として保存される場合、最終的にファイル名がディスク上のビットまたはバイトシーケンスとして終了する必要があるため、何らかの種類のエンコーディングが必要になります。ユーザーが選択できる場合は任意のカーネルに供給されたバイト配列に文字をマップするためのエンコーディングを、作成することが可能である任意の有効なファイル名のバイトシーケンスを。
次のことを想定します。ユーザーがランダムエンコーディングXを使用して、ファイルfoo
をバイトシーケンスαに変換し、ディスクに保存します。別のユーザーはエンコーディングYを使用します。このエンコーディングでは、αはに変換されますが/
、これはファイル名として許可されていません。ただし、最初のユーザーの場合、ファイルは有効です。
このシナリオは起こらないと思います。
ファイル名はバイナリBLOBとして保存されます
別の答えを引用するには: Linuxでファイル名とパスに使用される文字セットエンコーディングは何ですか?
他の人が述べたように、これに対する答えは実際にはありません。ファイル名とパスにはエンコードがありません。OSはバイトシーケンスのみを処理します。個々のアプリケーションは、何らかの方法でエンコードされていると解釈することを選択できますが、これは異なります。
システムが文字を処理しない場合、特定の文字(/
またはNULL
)をファイル名でどのように禁止できますか?/
エンコーディングなしの概念はありません。
説明は、ファイルシステムは任意の
文字を含むファイル名を格納でき、無効な文字を含むファイル名で停止するのはエンコードを考慮するユーザープログラムのみであるということです。これは、ファイルシステムとカーネルが/
。を含むファイル名を問題なく処理できることを意味します。
また、これは間違っていると思います。
エンコードはどこで行われ、特定の文字を許可しないという制限はどこにありますか?