c ++,cout和UTF-8

use*_*267 8 c++ cout utf-8

希望一个简单的问题: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)

koa*_*oan 2

这确实不足为奇。除非您的终端设置为 UTF-8 编码,否则s2假设您的终端设置为 ISO-8859,它如何知道不应该是“(带抑扬符的拉丁小写字母 a)(欧元符号)(管道)” -1 根据http://www.ascii-code.com/

顺便说一句,cout 并没有“消亡”,因为它显然在测试字符串之后继续产生输出。