这个程序代替打印所有三个字符,只打印一个.为什么它会这样?
#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位)并且我丢失了信息.我关心的是,为什么不打印所有三个字符而只打印一个?
丢弃每个16位值的一半后,剩余的8位值为:
0xef 0xbf 0xbd
Run Code Online (Sandbox Code Playgroud)
由于这些是不ASCII值(它们是在范围0x00到0x7f),输出取决于你的终端如何解释非ASCII值.一种常见的编码是UTF-8,这三个值碰巧形成Unicode 替换字符的有效UTF-8编码,显示为 .