首页 > 解决方案 > 在 std::u8string 和 std::string 之间转换

问题描述

添加了 C++20char8_tstd::u8string用于 UTF-8。但是,没有 UTF-8 版本,std::cout并且 OS API 大多期望char和执行字符集。所以我们仍然需要一种在 UTF-8 和执行字符集之间进行转换的方法。

我正在重读一篇char8_t 论文,看起来在 UTF-8 和 ECS 之间进行转换的唯一方法是使用std::c8rtombstd::mbrtoc8函数。但是,他们的 API 非常混乱。有人可以提供示例代码吗?

标签: c++unicodeutf-8c++20

解决方案


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 有什么用?


推荐阅读