如何使用unicode filename c ++读取二进制文件?

时间:2013-01-04 13:22:48

标签: c++ unicode c++11 ifstream

在我正在进行的项目中,我处理了很多字符串操作;从二进制文件中读取字符串及其编码(可以是单字节或双字节)。基本上,我将字符串值读为vector<char>,读取编码,然后将所有字符串转换为wstring,以保持一致。

这种方法运行得相当不错,但文件名本身可以是双字节字符。我完全不知道如何实际打开输入流。在CI中使用_wfopen函数传递wchar_t* path,但wifstream似乎表现不同,因为它专门用于从文件中读取双字节字符,而不是从文件中读取单个字节使用双字节文件名。

这个问题的解决方案是什么?

编辑:在网上搜索,看起来标准C ++中根本不支持此功能(例如,请参阅this discussion)。但是我想知道C ++ 11是否真的在这方面添加了一些有用的东西。

1 个答案:

答案 0 :(得分:1)

传递给open的字符串是如何映射到文件名的 依赖于实现。在Unix环境中,它被传递 几乎只有字面上'/''\0'被处理 特别。在其他环境中,其他规则是统治的,而且我已经 过去有问题,因为我在Unix中写了一个文件,而且 在Windows(它处理':'下无法对它做任何事情 特别是在文件名中。)

另一个问题是这些文件来自何处。如提到的那样 以上,可能绝对没有办法打开你的 system:只能打开一个':'的文件名 视窗。在Unix中,如果你最终得到'\0'个字符 文件名本身,你可能也读不懂它们和UTF16 文件名下面会显示'\0'个字符 Unix的。你只是解决方案可能是使用本机工具 生成文件以重命名的系统。

我不太清楚如何在Unix上获得这样的文件名 磁盘放在首位。如何像Samba这样的SMB服务器 在Windows机器上服务时映射UTF16文件名?或者 NFS服务器 - 我认为这些东西也存在于Windows下。