在结构中,文件名可以包含非标准字符
In the struct dirent can file names have nonstandard characters?
在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 将包含最初存储的任何数据。这通常是区域设置编码中的字符串,但无法保证。
相关文章:
- C4204:使用的非标准扩展:非常量聚合初始值设定项
- 在双重继承的情况下如何处理非标准构造函数
- CMake 不编译具有非标准扩展名的文件
- CMake 包含非 cmake 库的第三方标头
- 定义具有非标准签名的自定义映射比较器
- 我想获取点的属性,它报告错误 C3867:"point::output_x":非标准语法;使用"&"创建指向成员的指针
- 非标准语法,使用 & 创建指向成员的指针
- 在Qt中链接具有非标准名称的lib文件
- C++将包含非人类可读数据的字符串转换为 200 双精度
- 非标准语法使用 '&' 创建指向成员 C++ 的指针
- WINAPI EnumWindowsProc:非标准语法;使用 & 创建指向成员的点
- Vulkan-hpp 是reinterpret_casting非标准布局类到另一个类.这合法吗?
- 'cv::Mat::type':非标准语法;使用 '&' 创建指向成员的指针
- registerPointPickingCallback (PCLViewer::callback_Test,(void*)&viewer);返回 C3687 非标准语法;使用"&"创建指向成员的指针
- 错误 C4839:非标准地使用类 'ATL::CW2AEX<520>' 作为可变参数函数的参数
- C++ Visual Studio 2015:非标准语法;使用 '&' 创建指向成员的指针
- 将NetBeans配置为调试包含非标准库的C 程序
- 在结构中,文件名可以包含非标准字符
- 符合标准的编译器是否可以拒绝包含非多态类型向下转换dynamic_cast代码
- 我必须在c++中的类定义中包含非标准库吗?