我有一个将 UTF-8 字符串打印到控制台的程序:
#include <stdio.h>
int main()
{
printf("Мир Peace Ειρήνη\n");
return 0;
}
我将控制台配置为使用 True Type 字体(Lucida 控制台),定义 UTF-8 代码页(chcp 65001)用 MinGW GCC 和 Visual Studio 2010 编译这个程序它完美地工作,我看到:输出:
Мир Peace Ειρήνη
我做同样的使用std::cout
#include <iostream>
int main()
{
std::cout << "Мир Peace Ειρήνη\n" ;
return 0;
}
这与使用 MinGW GCC 的上述方法一样完美,但使用 Visual Studio 2010,我得到的方块比方块还多(每个非 ASCII 字母两个)。
如果我使用重定向运行程序,test >test.txt
我会在文件中获得完美的 UTF-8 输出。
两项测试均在 Windows 7 上完成。
问题:
- Visual Studio 标准库中的 printf 和 std::cout 在处理输出流方面有什么区别 - 显然其中一个有效而另一个无效?
- 如何解决这个问题?
真实答案:
简而言之:你被搞砸了 -std::cout
不能真正使用 MSVC + UTF-8 - 或者至少需要付出巨大的努力才能使其行为合理。
长篇大论:阅读答案中引用的两篇文章。