使用std :: wofstream写入文件.该文件仍然是空的

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)

  • @Armen Tsirunyan:对不起,我忽略了这一点.我尝试使用MSVC2008,似乎这个版本错过了标题. (2认同)

Art*_*yom 7

在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

  • 这仍然是 C++14 和 VS2015 的最佳方式吗? (2认同)