fstream的:: open()的Unicode或非ASCII字符不工作(与标准::内部监督办公室

2019-06-24 09:28发布

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

  • 文件 “A”(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)

Answer 1:

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

只是通过UTF-16编码的std :: wstring的到的fstream ::打开()。 这是为了使其与fstream的工作的唯一途径。

您可以了解更多关于什么我觉得是这里支持Windows Unicode的最简单的方法: http://utf8everywhere.org/



Answer 2:

使用标准的API(如性病:: fstream的),在Windows下你只能打开一个文件,如果文件名可以使用当前设置“Ansi代码页”(CP_ACP)进行编码。

这意味着可以是根本无法使用Windows这些API被打开的文件。 除非微软实现了CP_ACP设置为CP_UTF8那么这不能使用微软的CRT或C ++标准库的实现来支持。

(Windows已经有一个名为“短”文件名,其中,启用时,驱动器上的每个文件有,可以通过标准API使用的ASCII文件名。但是这个功能会消失,因此并不代表一个可行的解决方案的功能。)



文章来源: fstream::open() Unicode or Non-Ascii characters don't work (with std::ios::out) on Windows