![](/img/trans.png)
[英]Why rebind<U>::other are deprecated in C++17 and removed in C++20?
[英]Conversion from wstring to u16string and back (standard conform) in C++17 / C++20
我的主要平台是 Windows,这就是我在内部使用 UTF-16(主要是 BMP 字符串)的原因。 我想对这些字符串使用控制台 output 。
不幸的是,没有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–0xDBFF = 第一对,0xDC00– 0xDFFF = 第二对,不要插在中间)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.