在结构中,文件名可以包含非标准字符

In the struct dirent can file names have nonstandard characters?

本文关键字:包含 非标准 字符 文件名 结构      更新时间:2023-10-16

struct dirent中,成员d_name可以包含Unicode而不是ascii的字符吗?我测试过,它适用于"é",但我不确定这是否是因为"é"在 ascii 中。d_name是什么类型,如果是char,那么我就被箍了,但如果是wchar_t,我就得救了。

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

char d_name[];

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

实际上,支持的字符集取决于您的区域设置。在 C 术语中,d_name 中的字符串存储为"多字节"字符。

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

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

其他文件系统只是将文件名存储并公开为字节数组,因此 dirent 将包含最初存储的任何数据。这通常是区域设置编码中的字符串,但无法保证。