C++中的奇怪行为

tnk*_*sik 1 c++ utf-16

这个程序代替打印所有三个字符,只打印一个.为什么它会这样?

#include<iostream>
#include<string>

using namespace std;

int main() 
{
    string a("   ");
    a[0] = (char)65519; //Supposed to be UTF 16 characters
    a[1] = (char)65471;
    a[2] = (char)65469;

    //prints ?
    cout << a << std::endl;

    //prints ?
    for(int i = 0; i < a.size(); ++i) 
    {
        std::cout << a[i];
    }

    cout << "\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我可以理解理解正在打印的 字符,因为我的字符集没有有效的字形/表示,但为什么不打印3个这样的字符而只打印一个?为什么即使我使用for循环也会发生?

编辑:从下面的评论,我不关心信息的丢失.我知道我将一个整数(32位)类型转换为char(8位)并且我丢失了信息.我关心的是,为什么不打印所有三个字符而只打印一个?

Mik*_*our 7

丢弃每个16位值的一半后,剩余的8位值为:

0xef 0xbf 0xbd
Run Code Online (Sandbox Code Playgroud)

由于这些是不ASCII值(它们是在范围0x000x7f),输出取决于你的终端如何解释非ASCII值.一种常见的编码是UTF-8,这三个值碰巧形成Unicode 替换字符的有效UTF-8编码,显示为 .