我正在用std::codecvt_utf8将wstring转换为字符串,如本问题所述,但当我尝试希腊语或汉语字母符号损坏时,我可以在调试本地语言窗口中看到它,例如日本变成了";æ——;
std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv; //also tried codecvt_utf8_utf16
std::string str = myconv.to_bytes(wstr);
我做错了什么?
std::string
只是保存一个字节数组。它不包含关于这些字节应该被解释的编码的信息,标准库函数或std::string
成员函数通常也不假设任何关于编码的信息。它们将内容处理为一个字节数组。
因此,当需要呈现std::string
的内容时,如果没有以其他方式提供该信息,则呈现者需要对字符串的预期编码进行一些猜测。
我假设您打算转换为UTF8的编码,假设您使用的是std::codecvt_utf8
。
但是,如果您使用的是Virtual Studio,调试器只是假设一种特定的编码,至少在默认情况下是这样。该编码不是UTF8,但我想可能是代码页1252。
作为验证,python给出以下内容:
>>> '日本'.encode('utf8').decode('cp1252')
'日本'
您的字符串似乎是日本
的UTF8编码,被解释为它是cp1252编码的。
因此,转换似乎按预期进行。
如@MarkTolonen在注释中所述,可以在Visual Studio调试器中使用s8
说明符将字符串变量的编码指定为UTF8,如文档中所述。