使用unicode的std :: string的奇怪行为

时间:2014-12-13 19:29:26

标签: c++ ubuntu unicode g++ clang

我有以下代码:

#include <iostream>

std::string eps("ε");

int main()
{
    std::cout << eps << '\n';
    return 0;
}

不知何故,它在Ubuntu上用g ++和clang编译,甚至打印出正确的字符ε。 此外,我还有几段相同的代码,可以快速地将εcin一起读入std::string。 顺便说一句,eps.size()是2。

我的问题是 - 它是如何运作的?我们如何在std::string中插入unicode字符? 我的猜测是操作系统使用unicode处理所有这些工作,但我不确定。

修改

与输出一样,我知道终端负责向我展示正确的角色(在这种情况下为ε)。

但是输入:cin读取符号到' '或任何其他空格字符(据我逐字逐句了解)。所以,如果我取Ƞ,哪个第二个字节是32 ' ',它将只读取第一个字节,然后停止。但它会显示Ƞ。怎么样?

1 个答案:

答案 0 :(得分:5)

最可能的原因是所有内容都在UTF-8中编码,就像在我的系统上一样:

$ xxd test.cpp
...
0000020: 2065 7073 2822 ceb5 2229 3b0a 0a69 6e74   eps("..");..int
                        ^^^^ ε in UTF-8                 ^^ TWO bytes!
...
$ g++ -o test.out test.cpp
$ ./test.out 
ε
$ ./test.out | xxd
0000000: ceb5 0a
         ^^^^