Ber*_*nns 7 c++ utf-16 wstring utf-32 c++17
我的主要平台是 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应该足够大以包含任何支持的代码点。
事实上,所有支持 U+FFFF 之上的 Unicode 的地方wchar_t都是 32 位,除了 Windows(以及 Java,但这无关紧要)。所以,是的,即使在今天,以可移植的方式使用 Unicode 也是有问题的,或者sizeof(wchar_t)==2两者#ifdef _WIN32听起来都像是合法的解决方法。
话虽如此,无论底层编码如何,wcout仍然可以在所有平台上无缝工作。wchar_t
仅当您剪切wstring 或使用单独的代码点并且希望支持基本平面之外的代码点时,才需要考虑代理对(这仍然很简单,0xD800\xe2\x80\x930xDBFF = 首先对,0xDC00\xe2\x80\x930xDFFF = 第二对,不要插入中间)。
\n