从std::wstring转换为std::string



我正在用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,如文档中所述。

最新更新