C++ 和带有国家符号的文件路径(可能用 utf8 编码)
C++ and file paths with national symbols (encoded with utf8, maybe)
我有一些跨平台代码,它应该使用一些配置文件。一切正常,除非配置文件名路径包含非 ANSI 字符。
对于 opening/reading 文件,我使用 std::ifstream
。
在windows平台(MSVC)上,解决方案是使用std::ifstream
的重载版本,它可以接受路径名作为wchar_t*
,所以路径名编码为utf16,并且国家符号没有问题路径。
但是 NIX* 系统的解决方案是什么?
据我所知,所有这些文件名都是用 UTF-8 编码的,并且可以使用 char*
作为指向字符串的指针。
例如:
std::string path_name = ...; //assigning path name
std::ifstream fin(path_name.c_str());
但是 c_str()
怎么样 return 指向文件名字符串的常量指针,后跟 null
终止符?因为 UTF-8 字节序列可以包含零作为代码点的一部分,所以可以截断这样的字符串。
所以请指导我,我哪里错了,或者请建议一些便携式解决方案以防万一))
谢谢。
UTF-8 不包含零作为代码单元的一部分。多字节序列中的字节必须设置最高有效位。因此 UTF-8 文本可以像 ASCII 文本一样以零结尾。
因此您可以使用 path_name.c_str()
作为 UTF-8 编码的文件名。
我有一些跨平台代码,它应该使用一些配置文件。一切正常,除非配置文件名路径包含非 ANSI 字符。
对于 opening/reading 文件,我使用 std::ifstream
。
在windows平台(MSVC)上,解决方案是使用std::ifstream
的重载版本,它可以接受路径名作为wchar_t*
,所以路径名编码为utf16,并且国家符号没有问题路径。
但是 NIX* 系统的解决方案是什么?
据我所知,所有这些文件名都是用 UTF-8 编码的,并且可以使用 char*
作为指向字符串的指针。
例如:
std::string path_name = ...; //assigning path name
std::ifstream fin(path_name.c_str());
但是 c_str()
怎么样 return 指向文件名字符串的常量指针,后跟 null
终止符?因为 UTF-8 字节序列可以包含零作为代码点的一部分,所以可以截断这样的字符串。
所以请指导我,我哪里错了,或者请建议一些便携式解决方案以防万一))
谢谢。
UTF-8 不包含零作为代码单元的一部分。多字节序列中的字节必须设置最高有效位。因此 UTF-8 文本可以像 ASCII 文本一样以零结尾。
因此您可以使用 path_name.c_str()
作为 UTF-8 编码的文件名。