在 C++17 / C++20 中从 wstring 到 u16string 的转换(符合标准)
Conversion from wstring to u16string and back (standard conform) in C++17 / C++20
我的主要平台是 Windows,这就是我在内部使用 UTF-16(主要是 BMP 字符串)的原因。
我想对这些字符串使用控制台输出。
遗憾的是没有std::u16cout
或std::u8cout
所以我需要使用std::wcout
。因此,我必须将我的 u16strings 转换为 wstrings - 最好(也是最简单)的方法是什么?
在 Windows 我知道 wstring 指向 UTF16 数据,所以我可以创建一个使用相同数据(无转换)的简单 std::u16string_view。
但是在 Linux wstring 通常是 UTF32...
有没有办法在没有宏的情况下做到这一点,并且没有假设 sizeof(wchar_t) == 2 => utf16?
C++20 标准中没有任何内容可以将 wchar_t
转换为 char32_t
并返回。毕竟,wchar_t
supposed to be 足以包含 任何 支持的代码点。
而且确实支持 U+FFFF 以上的所有 Unicode,wchar_t
是 32 位的,除了 Windows(和 Java,但那是无关紧要的)。所以是的,即使在今天以可移植的方式使用 Unicode 也是有问题的,sizeof(wchar_t)==2
或 #ifdef _WIN32
听起来都是合法的解决方法。
话虽如此,wcout
仍可在所有平台上与 wchar_t
无缝协作,无论底层编码如何。
仅当您削减 wstrings或使用单独的代码点和您想要支持基本平面之外的代码点时, 然后你需要考虑代理对(这仍然很简单,0xD800–0xDBFF = 第一对,0xDC00–0xDFFF = 第二对,不要在中间剪断)。
我的主要平台是 Windows,这就是我在内部使用 UTF-16(主要是 BMP 字符串)的原因。 我想对这些字符串使用控制台输出。
遗憾的是没有std::u16cout
或std::u8cout
所以我需要使用std::wcout
。因此,我必须将我的 u16strings 转换为 wstrings - 最好(也是最简单)的方法是什么?
在 Windows 我知道 wstring 指向 UTF16 数据,所以我可以创建一个使用相同数据(无转换)的简单 std::u16string_view。 但是在 Linux wstring 通常是 UTF32... 有没有办法在没有宏的情况下做到这一点,并且没有假设 sizeof(wchar_t) == 2 => utf16?
C++20 标准中没有任何内容可以将 wchar_t
转换为 char32_t
并返回。毕竟,wchar_t
supposed to be 足以包含 任何 支持的代码点。
而且确实支持 U+FFFF 以上的所有 Unicode,wchar_t
是 32 位的,除了 Windows(和 Java,但那是无关紧要的)。所以是的,即使在今天以可移植的方式使用 Unicode 也是有问题的,sizeof(wchar_t)==2
或 #ifdef _WIN32
听起来都是合法的解决方法。
话虽如此,wcout
仍可在所有平台上与 wchar_t
无缝协作,无论底层编码如何。
仅当您削减 wstrings或使用单独的代码点和您想要支持基本平面之外的代码点时, 然后你需要考虑代理对(这仍然很简单,0xD800–0xDBFF = 第一对,0xDC00–0xDFFF = 第二对,不要在中间剪断)。