【发布时间】:2012-04-29 12:00:11
【问题描述】:
我有一个将 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 一起工作 - 或者至少
需要付出巨大的努力才能使其行为合理。
长篇大论:阅读答案中引用的两篇文章。
【问题讨论】:
-
将 unicode 直接嵌入源代码是不安全的 AFAIK。我相信最安全的方法是使用某种资源或使用 \u 和 u8 文字 (c++11) 输入 unicode 代码点
-
printf() 输出 unicode 和 std::cout �� 也是 Unicode problems in C++ but not C
标签: c++ winapi visual-c++ unicode