c++ - 在 C++17 / C++20 中从 wstring 转换为 u16string 并返回(标准符合)
问题描述
我的主要平台是 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–0xDBFF = 第一对,0xDC00– 0xDFFF = 第二对,不要插在中间)。
推荐阅读
- c++ - C++ 程序可以工作,但 windows 显示“program.exe 已停止工作”
- java - 将 Excel 转换为 CSV | SFTP | 大文件
- regex - 在正向回顾中使用可选组
- python - 在运行模式下出现无效语法错误,但在调试模式下运行时正常运行
- javascript - 在 ExtJS 中跟踪按钮
- contentful - 如何将 csv 数据注册为内容条目
- ruby-on-rails - rails db:迁移不起作用(psql(10.12(Ubuntu 10.12-0ubuntu0.18.04.1)))Windows 10
- python - 如何修复 Pandas 中的“unhashable type: 'numpy.ndarray'”错误?
- javascript - 将 nodejs 样式的导出转换为 typescript 样式的导出
- python - Python字典初始化和值追加到列表