我遇到了两个代码片段
std::wstring str = std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>>().from_bytes("some utf8 string");和,
std::wstring str = std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes("some utf8 string");它们是否都正确地将存储在std::string中的utf-8转换为std::wstring中的utf-16?
发布于 2019-08-24 15:12:50
codecvt_utf8_utf16所做的正是它所说的:在UTF-8和UTF-16之间进行转换,这两者都是可理解和可移植的编码。
codecvt_utf8在UTF-8和UCS-2/4之间进行转换(取决于给定类型的大小)。UCS-2和UTF-16不是一回事.
因此,如果您的目标是在wchar_t中存储真正的、实际的UTF-16,那么您应该使用codecvt_utf8_utf16。然而,如果您尝试使用wchar_t作为某种Unicode的东西进行跨平台编码,您就不能这样做。UTF-16方面总是转换为UTF-16,而在非Windows平台上的wchar_t通常是UTF-32/UCS-4。相比之下,codecvt_utf8只转换为UCS-2/4,但在wchar_t上,wchar_t字符串被“假定”为完全UTF-16。
因此,如果没有一些#ifdef或模板工作,就无法编写满足所有平台的代码。在Windows上,您应该使用codecvt_utf8_utf16;在非Windows上,您应该使用codecvt_utf8.
或者更好的是,只需在内部使用UTF-8,并找到直接以特定格式(而不是依赖于平台的wchar_t )接受字符串的API。
https://stackoverflow.com/questions/57639108
复制相似问题