从 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.
我正在按照 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
.
但是,如果您使用的是 Virtual Studio,调试器会简单地采用一种特定的编码,至少在默认情况下是这样。该编码不是 UTF8,但我想可能是代码页 1252。
作为验证,python给出以下内容:
>>> '日本'.encode('utf8').decode('cp1252')
'日本'
您的字符串似乎确实是 日本
的 UTF8 编码,被解释为好像是 cp1252 编码的。
因此转换似乎按预期进行了。
正如@MarkTolonen 在评论中提到的,可以在 Visual Studio 调试器中使用 s8
说明符将字符串变量的编码指定为 UTF8,如 in the documentation.