希望一个简单的问题:cout
处理以多字节UTF-8字符结尾的字符串时似乎死了,我做错了吗?这是在Win7 x64上使用GCC(Mingw).
**编辑抱歉,如果我不够清楚,我不关心丢失的字形或如何解释字节,只是在调用cout << s4
(缺少BAR)后它们没有显示.cout
在第一次显示之后的任何进一步的s没有任何文字!
#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…
Run Code Online (Sandbox Code Playgroud)
这确实不足为奇。除非您的终端设置为 UTF-8 编码,否则s2
假设您的终端设置为 ISO-8859,它如何知道不应该是“(带抑扬符的拉丁小写字母 a)(欧元符号)(管道)” -1 根据http://www.ascii-code.com/
顺便说一句,cout 并没有“消亡”,因为它显然在测试字符串之后继续产生输出。