use*_*241 1 c++ unicode codecvt c++11
我遇到了两个代码片段
std::wstring str = std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>>().from_bytes("some utf8 string");
Run Code Online (Sandbox Code Playgroud)
和,
std::wstring str = std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes("some utf8 string");
Run Code Online (Sandbox Code Playgroud)
它们是否都是将存储的 utf-8 转换std::string为 utf-16 的正确方法std::wstring?
codecvt_utf8_utf16 完全按照它说的做:在 UTF-8 和 UTF-16 之间转换,这两种编码都是易于理解且可移植的编码。
codecvt_utf8在 UTF-8 和 UCS-2/4 之间转换(取决于给定类型的大小)。UCS-2 和 UTF-16不是一回事。
所以,如果你的目标是存储真正的,实际的UTF-16的wchar_t,那么你应该使用codecvt_utf8_utf16。但是,如果您尝试使用wchar_t某种 Unicode 风格的东西或其他方式进行跨平台编码,则不能。UTF-16 方面始终转换为 UTF-16,而wchar_t在非 Windows 平台上,通常预计为 UTF-32/UCS-4。相比之下,codecvt_utf8只转换为 UCS-2/4,但在 Windows 上,wchar_t字符串“应该”是完整的 UTF-16。
因此,如果没有一些#ifdef或模板工作,您就无法编写满足所有平台的代码。在 Windows 上,您应该使用codecvt_utf8_utf16; 在非 Windows 上,您应该使用codecvt_utf8.
或者更好的是,只需在内部使用 UTF-8 并找到直接采用特定格式的字符串而不是平台相关wchar_t内容的API 。