10

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

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

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

编辑:在网上搜索,标准 C++ 中似乎根本不支持此功能(例如,请参阅此讨论)。但是我想知道 C++11 是否真的在这个领域添加了一些有用的东西。

4

1 回答 1

1

您传递给 open 的字符串如何映射到文件名取决于实现。在 Unix 环境中,它几乎是按字面意思传递的——只是'/''\0'特殊对待。在其他环境中,其他规则规则,并且我过去遇到过问题,因为我在 Unix 中编写了一个文件,并且在 Windows 下无法对它做任何事情(它':' 特别对待文件名中的 a )。

另一个问题是这些文件来自哪里。如上所述,可能绝对无法在您的系统上打开它们:带有 的文件名':'根本无法在 Windows 中打开。在 Unix 中,如果文件名本身包含字符,您可能也无法读取它们,并且 UTF16 文件名在 Unix 下'\0'似乎包含字符。'\0'您唯一的解决方案可能是在生成文件的系统上使用本机工具来重命名它们。

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

于 2013-01-04T14:00:15.653 回答