我使用 VS2008 编写了以下程序:
#include <fstream>
int main()
{
std::wofstream fout("myfile");
fout << L"Հայաստան Россия Österreich Ελλάδα भारत" << std::endl;
}
当我尝试编译它时,IDE 询问我是否想以 unicode 格式保存我的源文件,我说“是的,请”。
然后我运行程序,myfile 出现在我的项目文件夹中。我用记事本打开它,文件是空的。我记得记事本只支持 ASCII 数据。我用写字板打开它,它仍然是空的。最后,我内心的小天才敦促我查看文件大小,毫不奇怪它是 0 字节。所以我重建并重新运行程序,没有效果。最后,我决定在 StackOverflow 上向非常聪明的人询问我缺少什么,我在这里 :)
编辑:
在上述聪明人发表了一些意见后,我决定听从他们的建议,将程序改写成这样:
#include <fstream>
#include <iostream>
int main()
{
std::wofstream fout("myfile");
if(!fout.is_open())
{
std::cout << "Before: Not open...\n";
}
fout << L"Հայաստան Россия Österreich Ελλάδα भारत" << std::endl;
if(!fout.good())
{
std::cout << "After: Not good...\n";
}
}
建造它。跑了。而且……控制台清楚地显示,令我惊讶的是:“之后:不好……”。所以我编辑了我的帖子以提供新信息,并开始等待答案来解释为什么会这样以及我能做什么。 :)
原文由 Armen Tsirunyan 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 Visual Studio 中,输出流始终以 ANSI 编码编写,并且不支持 UTF-8 输出。
基本上需要做的是创建一个语言环境类,将其安装到 UTF-8 方面,然后将其灌输到 fstream 中。
代码点未转换为 UTF 编码会发生什么情况。所以基本上这在 MSVC 下是行不通的,因为它不支持 UTF-8。
这将在具有 UTF-8 语言环境的 Linux 下工作
〜在Windows下这将起作用:
因为 MSVC 仅支持 ANSI 编码。
Codecvt 方面可以在一些 Boost 库中找到。例如:http: //www.boost.org/doc/libs/1_38_0/libs/serialization/doc/codecvt.html