【问题标题】:c++ fstreams open file with utf-16 namec ++ fstream打开带有utf-16名称的文件
【发布时间】:2013-01-12 04:21:37
【问题描述】:

起初我在 Linux 上构建我的项目,它是围绕流构建的。

当我开始迁移到 Windows 时,我遇到了一些问题。
我有一个要以 UTF-16 编码打开的文件的名称。

我尝试使用 fstream:

QString source;  // content of  source  is shown on image
char *op= (char *) source.data();
fstream stream(op, std::ios::in | std::ios::binary);

但是文件无法打开。
当我检查它时,

 if(!stream.is_open())
   {}  // I always get that  it's not opened. But file indeed exists.

我试着用 wstream 来做。但结果是一样的,因为 wstream 也只接受 char *。据我了解是这样,因为作为 char * 发送的 string 在第一个零之后被截断,并且只发送文件名的一个符号,因此永远找不到文件。我知道 Vissual Studio 中的 wfstream 可以接受 wchar_t * 行作为名称,但我选择的编译器是 MinGW,它没有 wstring 构造函数的签名。

STL 流有什么办法吗?

添加
该字符串不仅可以包含 Ascii 符号,还可以同时包含俄语、德语、中文符号。我不想将自己仅限于 ASCII 或本地编码。

下一个补充
数据也可以不同,不仅是 ASCII,否则我根本不会用 Unicode 来打扰自己。 例如。

提前致谢!

【问题讨论】:

  • @qPCR4vir: 有什么关系?
  • 你为什么使用 Qt 但更喜欢 std::fstream 而不是 QFile
  • 我不想太靠近它。我想给自己一些机会来摆脱它

标签: c++ windows qt


【解决方案1】:

Boost::Filesystem 尤其是 fstream.hpp 标头可能会有所帮助。

【讨论】:

    【解决方案2】:

    如果你使用的是 MSVC 并且它是 c++ 标准库的实现,那么这样的东西应该可以工作:

    QString source;  // content of  source  is shown on image
    wchar_t *op= source.data();
    fstream stream(op, std::ios::in | std::ios::binary);
    

    之所以可行,是因为 Microsoft c++ 实现有一个扩展,允许使用宽字符串打开 fstream。

    【讨论】:

    • 呃,不幸的是,我用的是 Mingw(
    • 那么 boost::filesystem 的 fstream 实现是最好的答案。也可能有使用 mingw 和 libstdc++ 扩展的解决方案。
    【解决方案3】:

    在将文件名传递给 fstream 之前,使用带有 CP_ACP 的 WideCharToMultiByte 转换 UTF-16 字符串。

    【讨论】:

    • 并非每个文件都可以通过这种方式访问​​。如果文件名包含当前 ANSI 代码页中不存在的字符 ...
    • 是的,但这是 fstream 实现的限制。
    • fstreams 是有限的然后假装问题不存在对我来说似乎是个坏主意。是否有一些不可移植的 C++ 类最终会调用CreateFileW 来打开文件?似乎这样更适合提问者。
    • 其中一个建议是QFile
    猜你喜欢
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 2012-07-20
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    相关资源
    最近更新 更多