在我正在进行的项目中,我处理了很多字符串操作;从二进制文件中读取字符串及其编码(可以是单字节或双字节)。基本上,我将字符串值读为vector<char>
,读取编码,然后将所有字符串转换为wstring
,以保持一致。
这种方法运行得相当不错,但文件名本身可以是双字节字符。我完全不知道如何实际打开输入流。在CI中使用_wfopen
函数传递wchar_t* path
,但wifstream
似乎表现不同,因为它专门用于从文件中读取双字节字符,而不是从文件中读取单个字节使用双字节文件名。
这个问题的解决方案是什么?
编辑:在网上搜索,看起来标准C ++中根本不支持此功能(例如,请参阅this discussion)。但是我想知道C ++ 11是否真的在这方面添加了一些有用的东西。
答案 0 :(得分:1)
传递给open的字符串是如何映射到文件名的
依赖于实现。在Unix环境中,它被传递
几乎只有字面上'/'
和'\0'
被处理
特别。在其他环境中,其他规则是统治的,而且我已经
过去有问题,因为我在Unix中写了一个文件,而且
在Windows(它处理':'
下无法对它做任何事情
特别是在文件名中。)
另一个问题是这些文件来自何处。如提到的那样
以上,可能绝对没有办法打开你的
system:只能打开一个':'
的文件名
视窗。在Unix中,如果你最终得到'\0'
个字符
文件名本身,你可能也读不懂它们和UTF16
文件名下面会显示'\0'
个字符
Unix的。你只是解决方案可能是使用本机工具
生成文件以重命名的系统。
我不太清楚如何在Unix上获得这样的文件名 磁盘放在首位。如何像Samba这样的SMB服务器 在Windows机器上服务时映射UTF16文件名?或者 NFS服务器 - 我认为这些东西也存在于Windows下。