我打印出std :: string的字节表示时遇到奇怪的错误,而std :: wstring工作正常.
std::string str = "mystring";
unsigned short* vtemp = (unsigned short*)str.c_str();
for(int i=0; i<str.length(); ++i)
{
cout << (unsigned short)((unsigned char)vtemp[i]) << " ";
}
cout << endl;
Incorrect Output: 109 115 114 110 0 204 204 204
wstring wstr(str.length(), L' ');
std::copy(str.begin(), str.end(), wstr.begin());
vtemp = (unsigned short*)wstr.c_str();
for(int i=0; i<wstr.length(); ++i)
{
cout << (unsigned short)((unsigned char)vtemp[i]) << " ";
}
cout << endl;
Correct Output: 109 121 115 116 114 105 110 103
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,跳过每个替代字符.为什么这样?
该程序在Windows上运行,在项目设置中启用了unicode字符集.
正是因为这条线:
unsigned short* vtemp = (unsigned short*)str.c_str();
Run Code Online (Sandbox Code Playgroud)
unsigned short是两个字节长.char是一个字节长.您正在设置一个unsigned short指向char数组的指针,并通过指针索引(每两个字节)进行迭代.
编译器通常会告诉你,但是你使用C风格的强制转换会阻止这种情况(因为C风格的强制转换会无声地失败).
稍后编辑:您的代码也会索引unsigned short*最多str.length()元素,但(short大于char)您的数组只包含str.length() / 2 unsigned short可索引元素.
在某些机器上运行该代码可能会导致核心转储.