繁体   English   中英

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

[英]fstream::open() Unicode or Non-Ascii characters don't work (with std::ios::out) on Windows

在 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,所以没有fstream::open(const wchar_t*, ios_base::openmode) )?

在 Windows 上使用标准 API(例如 std::fstream)您只能打开文件,如果文件名可以使用当前设置的“ANSI 代码页”(CP_ACP)进行编码。

这意味着在 Windows 上使用这些 API 可能无法打开某些文件。 除非 Microsoft 实现了将 CP_ACP 设置为 CP_UTF8 的支持,否则无法使用 Microsoft 的 CRT 或 C++ 标准库实现来完成。

(Windows 有一个称为“短”文件名的功能,启用后,驱动器上的每个文件都有一个 ASCII 文件名,可以通过标准 API 使用。但是此功能即将消失,因此它不代表可行的解决方案。)

更新:Windows 10 添加了对将代码页设置为 UTF-8 的支持

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

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

您可以在这里阅读更多关于我认为在 Windows 上支持 unicode 的最简单方法的信息: http : //utf8everywhere.org/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM