Ale*_*s G 10 c++ unicode ifstream c++11
在我正在研究的项目中,我处理了很多字符串操作; 从二进制文件中读取字符串及其编码(可以是单字节或双字节).本质上,我读取字符串值为vector<char>,读取编码,然后将所有字符串转换为wstring,以保持一致性.
这工作得相当好,但文件名本身可以是双字节字符.我完全不知道如何实际打开输入流.在CI中会使用_wfopen函数传递wchar_t* path,但wifstream似乎表现不同,因为它专门用于从文件中读取双字节字符,而不是从具有双字节文件名的文件中读取单个字节.
这个问题的解决方案是什么?
编辑:搜索网络,看起来在标准C++中根本不支持这一点(例如,请参阅此讨论).但是我想知道C++ 11是否真的在这方面添加了一些有用的东西.
您传递给 open 的字符串如何映射到文件名取决于实现。在 Unix 环境中,它几乎只是按字面意思传递,'/'并且'\0'经过特殊处理。在其他环境中,则有其他规则,我过去遇到过问题,因为我在 Unix 中编写了一个文件,而在 Windows 下无法对其执行任何操作(Windows 会':'
特别对待文件名中的 a)。
另一个问题是这些文件从哪里来。如上所述,可能完全无法在您的系统上打开它们:带有 的文件名':'根本无法在 Windows 中打开。在 Unix 中,如果文件名本身包含字符,您可能也无法读取它们,并且 UTF16 文件名在 Unix 下'\0'似乎包含字符。'\0'您唯一的解决方案可能是使用生成文件的系统上的本机工具来重命名它们。
我不太清楚如何在 Unix 磁盘上获取这样的文件名。SMB 服务器(例如 Samba)在 Windows 机器上提供服务时如何映射 UTF16 文件名?或者NFS服务器——我想Windows下也存在这样的东西。