我使用VS2008编写了以下程序:
#include <fstream> int main() { std::wofstream fout("myfile"); fout << L"Հայաստան Россия Österreich Ελλάδα भारत" << std::endl; }
当我试图编译它时,IDE问我是否想用unicode保存我的源文件,我说“是的,请”。
然后我运行该程序,myfile出现在我的项目文件夹中。 我用记事本打开它,文件是空的。 我记得记事本只支持ASCII数据。 我用写字板打开它,它仍然是空的。 最后,我的小天才催促我看看文件大小,毫不奇怪,它是0字节。 所以我重build并重新编程,没有任何效果。 最后,我决定问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"; } }
build造它。 跑吧。 而且……主持人清楚地读到,令我惊讶的是:“之后:不好……”。 所以我编辑我的post提供新的信息,并开始等待答案,这将解释为什么这是我能做的。 🙂
在Visual Studio中,输出流总是以ANSI编码写入,并且不支持UTF-8输出。
基本上需要做的是创建一个语言环境类,安装到UTF-8方面,然后灌输给fstream。
会发生什么代码点没有被转换为UTF编码。 所以基本上这不会在MSVC下工作,因为它不支持UTF-8。
这将在UTF-8语言环境的Linux下工作
#include <fstream> int main() { std::locale::global(std::locale("")); std::wofstream fout("myfile"); fout << L"Հայաստան Россия Österreich Ελλάδα भारत" << std::endl; }
〜在Windows下这将工作:
#include <fstream> int main() { std::locale::global(std::locale("Russian_Russia")); std::wofstream fout("myfile"); fout << L"Россия" << std::endl; }
由于只有MSVC支持ANSI编码。
Codecvt方面可以在一些Boost库中找到。 例如: http : //www.boost.org/doc/libs/1_38_0/libs/serialization/doc/codecvt.html
MSVC为这个问题提供了codecvt_utf8
locale facet。
#include <codecvt> // ... std::wofstream fout(fileName); std::locale loc(std::locale::classic(), new std::codecvt_utf8<wchar_t>); fout.imbue(loc);