我使用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)
建造它.跑吧.并且...控制台清楚地读到了,令我惊讶的是:"之后:不好......".所以我编辑了我的帖子以提供新的信息,并开始等待答案,这可以解释为什么这是我能做什么.:)
以下代码重现了我的问题:
#include <iostream>
#include <iomanip>
#include <string>
void p(std::string s, int w)
{
std::cout << std::left << std::setw(w) << s;
}
int main(int argc, char const *argv[])
{
p("COL_A", 7);
p("COL_B", 7);
p("COL_C", 5);
std::cout << std::endl;
p("ABC", 7);
p("ÅÄÖ", 7);
p("ABC", 5);
std::cout << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这会产生以下输出:
COL_A COL_B COL_C
ABC ÅÄÖ ABC
Run Code Online (Sandbox Code Playgroud)
如果我将代码中的"ÅÄÖ"更改为例如"ABC",那么它的工作原理如下:
COL_A COL_B COL_C
ABC ABC ABC
Run Code Online (Sandbox Code Playgroud)
为什么会这样?