【发布时间】:2011-08-05 09:03:10
【问题描述】:
希望是一个简单的问题:cout 在处理以多字节 UTF-8 字符结尾的字符串时似乎死了,我做错了什么吗?这是 Win7 x64 上的 GCC (Mingw)。
**编辑对不起,如果我不够清楚,我不关心丢失的字形或字节的解释方式,只是在调用 cout << s4 后它们根本没有显示(缺少 BAR )。在第一次显示任何文字后,任何进一步的couts 都没有!
#include <cstdio>
#include <iostream>
#include <string>
int main() {
std::string s1("abc");
std::string s2("…"); // … = 0xE2 80 A6
std::string s3("…abc");
std::string s4("abc…");
//In C
fwrite(s1.c_str(), s1.size(), 1, stdout);
printf(" FOO ");
fwrite(s2.c_str(), s2.size(), 1, stdout);
printf(" BAR ");
fwrite(s3.c_str(), s3.size(), 1, stdout);
printf(" FOO ");
fwrite(s4.c_str(), s4.size(), 1, stdout);
printf(" BAR\n\n");
//C++
std::cout << s1 << " FOO " << s2 << " BAR " << s3 << " FOO " << s4 << " BAR ";
}
// results:
// abc FOO ��� BAR ���abc FOO abc… BAR
// abc FOO ��� BAR ���abc FOO abc…
【问题讨论】:
-
你在哪里运行你的程序? Windows 命令提示符确实不太喜欢 Unicode,因此虽然您的程序可能输出文本很好,但控制台不知道如何处理它。
-
@jalf:Windows 控制台子系统没有真正的问题。
WriteConsoleW在给定正确字体的情况下工作得相当好。不过,Windows 不喜欢 UTF-8,这意味着WriteConsoleA会在这里窒息。 -
在 Ubuntu/gnome-terminal/GCC 上为我工作。我怀疑要做到这一点需要 C++ 正确性和考虑平台细节。
-
@MSalters:哦,是的,我应该更具体一点。
-
管道输出到一个文件并在记事本中打开该文件。会发生什么?