首页 > 解决方案 > C++ 和带有国家符号的文件路径(可能用 utf8 编码)

问题描述

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

所以请指导我,我错了,或者如果我没问题,请建议一些便携式解决方案))

谢谢你。

标签: c++unicodeutf-8filenames

解决方案


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

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


推荐阅读