Arm*_*yan 13 c++ windows encoding visual-studio wofstream
我使用VS2008编写了以下程序:
#include <fstream>
int main()
{
std::wofstream fout("myfile");
fout << L"???????? ?????? Österreich ?????? ????" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译它时,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";
}
}
Run Code Online (Sandbox Code Playgroud)
建造它.跑吧.并且...控制台清楚地读到了,令我惊讶的是:"之后:不好......".所以我编辑了我的帖子以提供新的信息,并开始等待答案,这可以解释为什么这是我能做什么.:)
Der*_*hen 11
MSVC codecvt_utf8为此问题提供了区域设置方面.
#include <codecvt>
// ...
std::wofstream fout(fileName);
std::locale loc(std::locale::classic(), new std::codecvt_utf8<wchar_t>);
fout.imbue(loc);
Run Code Online (Sandbox Code Playgroud)
在Visual Studio中,输出流始终以ANSI编码编写,并且不支持UTF-8输出.
基本上需要做的是创建一个语言环境类,在其中安装UTF-8 facet,然后将其灌输到fstream.
如果代码点没有转换为UTF编码会发生什么.所以基本上这不适用于MSVC,因为它不支持UTF-8.
这可以在Linux下使用UTF-8语言环境
#include <fstream>
int main()
{
std::locale::global(std::locale(""));
std::wofstream fout("myfile");
fout << L"???????? ?????? Österreich ?????? ????" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
〜在Windows下,这可以工作:
#include <fstream>
int main()
{
std::locale::global(std::locale("Russian_Russia"));
std::wofstream fout("myfile");
fout << L"??????" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
由于MSVC仅支持ANSI编码.
Codecvt方面可以在一些Boost库中找到.例如:http://www.boost.org/doc/libs/1_38_0/libs/serialization/doc/codecvt.html
| 归档时间: |
|
| 查看次数: |
11685 次 |
| 最近记录: |