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

Convert from std::wstring to std::string

我正在按照 this question 中的描述使用 std::codecvt_utf8 将 wstring 转换为字符串,但是当我尝试希腊或中文字母符号已损坏时,我可以在 debug Locals [=19] 中看到它=],例如日本 变成了“日本”

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 的内容需要呈现时,呈现者需要对字符串的预期编码进行一些猜测,如果该信息未以其他方式提供的话。

鉴于您使用的是 std::codecvt_utf8.

,我假设您打算转换成的编码是 UTF8

但是,如果您使用的是 Virtual Studio,调试器会简单地采用一种特定的编码,至少在默认情况下是这样。该编码不是 UTF8,但我想可能是代码页 1252。

作为验证,python给出以下内容:

>>> '日本'.encode('utf8').decode('cp1252')
'日本'

您的字符串似乎确实是 日本 的 UTF8 编码,被解释为好像是 cp1252 编码的。

因此转换似乎按预期进行了。


正如@MarkTolonen 在评论中提到的,可以在 Visual Studio 调试器中使用 s8 说明符将字符串变量的编码指定为 UTF8,如 in the documentation.