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

jus*_*der 6 c++ unicode ubuntu g++ clang

我有以下代码:

#include <iostream>

std::string eps("?");

int main()
{
    std::cout << eps << '\n';
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

不知何故,它在Ubuntu上用g ++和clang编译,甚至打印出正确的字符?.我也有几乎同样的一段代码,它高兴地读取?cinstd::string.顺便说一下,eps.size()是2.

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

编辑

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

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

NPE*_*NPE 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
         ^^^^              
Run Code Online (Sandbox Code Playgroud)