首页 > 解决方案 > “codecvt_utf8_utf16”和“codecvt_utf8”从UTF-8转换为UTF-16的区别

问题描述

我遇到了两个代码片段

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");

它们都是将存储的 utf-8 转换std::string为 utf-16 in 的正确方法std::wstring吗?

标签: c++c++11unicodecodecvt

解决方案


codecvt_utf8_utf16正如它所说的那样:在 UTF-8 和 UTF-16 之间进行转换,这两种编码都是易于理解且可移植的编码。

codecvt_utf8在 UTF-8 和 UCS-2/4 之间转换(取决于给定类型的大小)。UCS-2 和 UTF-16不是一回事

因此,如果您的目标是将真正的、实际的 UTF-16 存储在 a 中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。


推荐阅读