繁体   English   中英

在 C++17 / C++20 中从 wstring 转换为 u16string 并返回(符合标准)

[英]Conversion from wstring to u16string and back (standard conform) in C++17 / C++20

我的主要平台是 Windows,这就是我在内部使用 UTF-16(主要是 BMP 字符串)的原因。 我想对这些字符串使用控制台 output 。

不幸的是,没有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 应该足够大以包含任何支持的代码点。

实际上,在 U+FFFF 以上的任何地方 Unicode 都受支持, wchar_t是 32 位的,除了 Windows (和 Java),但这无关紧要。 所以是的,即使在今天以便携方式使用 Unicode 也是有问题的,并且sizeof(wchar_t)==2#ifdef _WIN32听起来都是合法的解决方法。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM