首页 > 解决方案 > 在 C++17 / C++20 中从 wstring 转换为 u16string 并返回(标准符合)

问题描述

我的主要平台是 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++c++17utf-16wstringutf-32

解决方案


C++20 标准中没有任何东西可以wchar_t相互转换char32_t。毕竟,应该wchar_t足够大以包含任何支持的代码点。

实际上,U+FFFF 以上的所有 Unicode 都支持wchar_t32 位,Windows 除外(在 Java 中,但这无关紧要)。所以是的,即使在今天以可移植的方式使用 Unicode 也是有问题的,sizeof(wchar_t)==2或者#ifdef _WIN32两者听起来都是合法的解决方法。

话虽如此,无论底层编码如何,wcout仍然可以在所有平台上无缝使用。wchar_t

只有当您剪切wstring 或使用单个代码点并且您希望支持基本平面之外的代码点时,才需要考虑代理对(这仍然很容易,0xD800–0xDBFF = 第一对,0xDC00– 0xDFFF = 第二对,不要插在中间)。


推荐阅读