在 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::u16coutstd::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 = 第二对,不要在中间剪断)。