fstream::open() Unicode 或非 Ascii 字符在 Windows 上不起作用(使用 std::ios::out)

2023-12-02

在 C++ 项目中,我想打开一个文件(fstream::open())(这似乎是一个主要问题)。我的程序的 Windows 构建惨遭失败。

  • 文件“ä”(UTF-8 0xC3 0xA4)

    std::string s = ...;
    //Convert s
    std::fstream f;
    f.open(s.c_str(), std::ios::binary | std::ios::in); //Works (f.is_open() == true)
    f.close();
    f.open(s.c_str(), std::ios::binary | std::ios::in | std::ios::out); //Doesn't work
    

    字符串s是 UTF-8 编码,但随后从 UTF-8 转换为 Latin1 (0xE4)。我用的是Qt,所以QString::fromUtf8(s.c_str()).toLocal8Bit().constData().

    为什么我可以打开文件进行读取,但不能进行写入?

  • 文件“и”(UTF-8 0xD0 0xB8)

    同样的代码,根本不起作用。

看来,这个字符不适合 Windows-1252 字符集。我怎样才能打开这样的fstream(我没有使用MSVC,所以no fstream::open(const wchar_t*, ios_base::openmode))?


在 Microsoft 的 STL 实现中,有一个非标准扩展(重载)以允许对 UTF-16 编码字符串提供 unicode 支持。

只需将 UTF-16 编码的 std::wstring 传递给 fstream::open() 即可。这是使其与 fstream 一起工作的唯一方法。

您可以在此处详细了解我认为在 Windows 上支持 unicode 的最简单方法:http://utf8everywhere.org/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

fstream::open() Unicode 或非 Ascii 字符在 Windows 上不起作用(使用 std::ios::out) 的相关文章

随机推荐