struct dirent
メンバーd_name
はユニコードであるがASCIIではない文字を持つことができますか?テストしたところ、「é」で動作しますが、「é」がASCIIであるためかどうかはわかりません。タイプは何ですかd_name
、char
それなら私はフープされますが、それならwchar_t
私は救われます。
2 に答える
Open Group Base Specificationにstruct dirent
は、サイズが指定されていない次のメンバーが含まれている必要があります。
char d_name[];
準拠する実装では、それは型ですchar[]
が、それは必ずしもUnicode文字を格納できないことを意味するわけではありません。この仕様では、複数の文字セット(または移植可能な文字セットを超える文字)のサポートは必要ありませんが、それも禁止されていません('é'
ちなみに、ASCIIではありません)。
実際には、サポートされる文字セットはロケールによって異なります。C用語では、の文字列はd_name
「マルチバイト」文字として格納されます。
これは、プラットフォームとファイルシステムによって異なります。たとえば、HFS +ファイルシステムはUTF-16を使用してファイル名を内部に格納し、それらをUTF-8として公開するためchar
、direntの配列には(ロケールに関係なく)UTF-8文字列が含まれている必要があると思います。
NTFSはファイル名をUTF-16にも保存しますが、公開される内容はプラットフォームによって異なります。Windowsは、システムロケールとUTF-16の間で変換を行います。別のプラットフォームがUTF-16とUTF-8の間で変換する場合があります。別のプラットフォームがUTF-16と直接の環境のロケールの間で変換する場合があります。
他のファイルシステムは、ファイル名をバイト配列として保存および公開するだけなので、direntには最初に保存されたデータがすべて含まれます。これは通常、ロケールエンコーディングの文字列になりますが、保証はありません。