我有一些跨平台代码,应该使用一些配置文件。一切正常,除非配置文件名称路径包含非ANSI字符的情况除外。
对于打开/读取文件,我使用的是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()
会返回指向文件名字符串的常量指针,然后是null
终止符吗?由于UTF-8字节序列可以包含零作为代码点的一部分,因此此类字符串可以被截断。
所以,如果我错了,请告诉我,或者在我确定的情况下,请提出一些便携式的解决方案))
谢谢。
答案 0 :(得分:3)
UTF-8不包含零作为代码单元的一部分。多字节序列中的字节必须设置最高有效位。因此,UTF-8文本可以像ASCII文本一样以零结尾。
因此,您可以将path_name.c_str()
用作UTF-8编码的文件名。