带国家符号的C ++和文件路径(也许用utf8编码)

时间:2018-09-30 18:43:21

标签: c++ unicode utf-8 filenames

我有一些跨平台代码,应该使用一些配置文件。一切正常,除非配置文件名称路径包含非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字节序列可以包含零作为代码点的一部分,因此此类字符串可以被截断。

所以,如果我错了,请告诉我,或者在我确定的情况下,请提出一些便携式的解决方案))

谢谢。

1 个答案:

答案 0 :(得分:3)

UTF-8不包含零作为代码单元的一部分。多字节序列中的字节必须设置最高有效位。因此,UTF-8文本可以像ASCII文本一样以零结尾。

因此,您可以将path_name.c_str()用作UTF-8编码的文件名。