c++ - 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 字节序列可以包含零作为代码点的一部分,所以可以截断这样的字符串。
所以请指导我,我错了,或者如果我没问题,请建议一些便携式解决方案))
谢谢你。
解决方案
UTF-8 不包含零作为代码单元的一部分。多字节序列中的字节必须设置最高有效位。因此 UTF-8 文本可以像 ASCII 文本一样以零结尾。
因此,您可以path_name.c_str()
在 UTF-8 编码中用作文件名。
推荐阅读
- quickfix - 如何按顺序发送登录消息?
- mysql - SQL查询:获取最贵订单的日期和customerid
- excel - 在 Excel 中将变量添加到索引匹配函数
- javascript - React Axios - JSON Get 响应未从 render() 显示 - Riot API
- apache-kafka - Kafka Streams 加入不相关的流
- python - bbox、label、conf = cv.detect_common_objects(img) 命令无法正常工作
- javascript - 如何在javascript中实现双端队列数据结构?
- mysql - 如何减去两个 sql 时间戳字段,然后以小时为单位返回时差
- c# - SignalR .NET 框架与 SignalR .NET Core 功能
- python - 从另一个形状不同的数据帧中替换数据帧