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



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

不幸的是,没有std::u16coutstd::u8cout,所以我需要使用std::wcout。因此,我必须将我的u16string转换为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无缝工作。

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

最新更新