在struct dirent中,文件名是否有非标准字符?

时间:2012-08-17 18:48:36

标签: c++ character-encoding

struct dirent中,成员d_name的字符是unicode但不是ascii吗?我测试过,它与'é'一起使用,但我不确定是不是因为'é'在ascii中。什么类型是d_name,如果它是char那么我就会被哄骗但是如果它是wchar_t我就会被保存。

2 个答案:

答案 0 :(得分:1)

开放组基本规范声明struct dirent应具有以下未指定大小的成员:

char d_name[];

在符合实现的情况下,它的类型为char[],但这并不一定意味着它不能存储Unicode字符;规范不要求支持多个字符集(或者可移植字符集之外的字符),但它也不要禁止它(顺便说一句'é',不是ASCII)。

实际上,支持的字符集取决于您的语言环境。在C语言中,d_name中的字符串存储为“多字节”字符。

答案 1 :(得分:0)

这取决于您的平台和文件系统。例如,HFS +文件系统使用UTF-16在内部存储文件名,并将它们公开为UTF-8,因此我认为dirent中的char数组应包含UTF-8字符串(无论您的语言环境如何)。

NTFS也以UTF-16存储文件名,但它们所公开的内容取决于平台。 Windows在系统区域设置和UTF-16之间进行转换。另一个平台可以在UTF-16和UTF-8之间进行转换。另一个平台可以在UTF-16和直接环境的区域设置之间进行转换。

其他文件系统只是将文件名存储和公开为字节数组,因此dirent将包含最初存储的数据。这通常是语言环境编码中的字符串,但不能保证。