为什么codecvt_utf8给出十六进制值作为开头附加的ffffff



对于此代码-

int main()
{
std::wstring wstr = L"é";
std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
std::stringstream ss;
ss << std::hex << std::setfill('0');
for (auto c : myconv.to_bytes(wstr))
{
ss << std::setw(2) << static_cast<unsigned>(c);
}
string ssss = ss.str();
cout << "ssss = " << ssss << endl;

为什么要打印ffffffc3ffffffa9而不是c3a9?

为什么在开头附加ffffff?如果你想在ideone中运行它-https://ideone.com/qZtGom

c的类型为char,在大多数系统上都有签名。将char转换为无符号会导致值进行符号扩展。

示例:

  • char(0x23(aka 35->无符号(0x00000023(
  • char(0x80(aka-128->无符号(0xFFFFFF80(
  • char(0xC3(aka-61->无符号(0xFFFFFFc3(

[编辑:我的第一个建议不起作用;已删除]

你可以投两次:ss << std::setw(2) << static_cast<int>(static_cast<unsigned char>(c));

第一个强制转换为您提供了一个具有相同位模式的无符号类型,并且由于unsigned charchar大小相同,因此没有符号扩展。

但是,如果您只输出static_cast<unsigned char>(c),流将把它当作一个字符,并打印。。某物取决于您的地区等。

第二个强制转换为您提供一个int,流将正确输出该int。

最新更新