c++ - 在 std::u8string 和 std::string 之间转换
问题描述
添加了 C++20char8_t
并std::u8string
用于 UTF-8。但是,没有 UTF-8 版本,std::cout
并且 OS API 大多期望char
和执行字符集。所以我们仍然需要一种在 UTF-8 和执行字符集之间进行转换的方法。
我正在重读一篇char8_t 论文,看起来在 UTF-8 和 ECS 之间进行转换的唯一方法是使用std::c8rtomb
和std::mbrtoc8
函数。但是,他们的 API 非常混乱。有人可以提供示例代码吗?
解决方案
C++20 中的 UTF-8 “支持”似乎是个坏笑话。
标准库中唯一的 UTF 功能是支持字符串和 string_views(std::u8string、std::u8string_view、std::u16string,...)。就这些。在正则表达式、格式化、文件 i/o 等方面没有标准库支持 UTF 编码。
在 C++17 中,您可以 - 至少 - 轻松地将任何 UTF-8 数据视为“char”数据,这使得 std::regex、std::fstream、std::cout 等的使用成为可能而不会丢失的表现。
在 C++20 中,情况会发生变化。例如std::string text = u8"...";
,您不能再写了
std::u8fstream file; std::u8string line; ... file << line;
因为没有 std::u8fstream。
即使是新的 C++20 std::format 也根本不支持 UTF,因为根本没有所有必要的重载。你不能写
std::u8string text = std::format(u8"...{}...", 42);
更糟糕的是,在 std::string 和 std::u8string 之间(甚至在 const char* 和 const char8_t* 之间)没有简单的转换(或转换)。因此,如果要格式化(使用 std::format)或输入/输出(std::cin、std::cout、std::fstream、...)UTF-8 数据,则必须在内部复制所有字符串。- 这将是一个不必要的性能杀手。
最后,如果没有输入、输出和格式化,UTF 有什么用?
推荐阅读
- here-api - 是否有可能将 ExtraVoice 命令添加到从 heremaps 运行的语音指导中?
- java-8 - 来自“jmap -heap”的 Java8 中的新命令是什么
Java8中jmap堆的命令是什么。我需要为特定进程找到内存的Oldgen空间。
- java - 数据库时区问题
- idris - 有没有办法重写和简化`decEq xx`?
- python - 如何在python中使用beautifulsoup查找第n个子标题并打印文本
- python - 如何从 Pyspark 数据框中获取最后一行数据然后将其删除
- java - 嵌入式 Kafka 用于在没有弹簧的情况下进行测试
- yii2 - 标题存在,我可以单击标题,但是在浏览器上运行时看不到它
- python - 取每一条奇数行(1、3、5,...)?
- ios - Flutter firebase_admob 无法在 iOS 上使用默认应用安装