我们会在未来的 C++ 版本中使用 size_t strlen(const char8_t*)

Will we have a size_t strlen(const char8_t*) in a future C++ version

char8_t 在 C++20 中修复了 char 的一些问题,所以我正在考虑使用 char8_t 而不是 char 用于 utf8 文本(例如来自命令的文本线)。但后来我注意到 strlen 没有在标准中指定与 char8_t 一起使用,实际上 cstring 库中的函数 none 是。我可以期望这会在下一次标准更新中发生吗?还是 char8_t 从未打算按照我的想法替换 char

这些新的char类型是为了使用C++字符串模板std::basic_string,即定义std::u8string。所以在你的情况下最好的是使用 C++ 字符串。

关于cstring库中char8_t的未来支持,我想这个问题更适合未来的C标准。恐怕,这不会是一个简单的更新,也不太可能更新,因为 C 没有重载函数,并且此更新将需要新函数,如 c8slen 除了 strlen 和 [=15] =].

我是 P0482 and P1423 char8_t 提案的作者。

这些提案的目的是引入 char8_t 类型,为 char16_tchar32_t 提供相同级别的支持,然后在以后跟进其他功能。这些提议是在 C++20 开发周期的后期(分别在圣地亚哥和科隆会议上)通过的,因此没有机会为 C++20 提供额外的功能。

SG16 as described in P1238 的指令之一是标准化新的编码感知文本容器和视图类型。这方面的工作正在取得进展,我们希望为 C++23 提供它。希望这些新的容器和视图能够取代 C++ 中的大量原始字符串处理。

具体来说strlenstrlen是一个CAPI。 N2231 是为 C 添加 char8_t 支持的提案(同样,与 char16_tchar32_t 的现有支持处于同一级别)。 WG14 尚未接受该提案。假设它最终被接受,那么跟进额外的基于 char8_t 的 C 字符串管理函数(也许还增强对 char16_tchar32_t 的支持)是有意义的。

目前,我正在努力完成 N2231 在 gcc 和 glibc 中的实现。完成后,我打算将 N2231 的修订版提交给 WG14。

你可以帮忙! SG16 是一个开放组。请随时订阅我们的邮件列表,加入我们的 Slack,分享您的想法、需求和愿望,并为新功能撰写提案(我们可以帮助您实现)。

char8_t 适用于 UTF-8 编码的字符串。因此,使用它们的 API 将被用户假定 在某种程度上支持 Unicode。相当多的 contents of the <cstring> header 不适合 char8_t,因为它们的行为非常不符合 Unicode(strcmp 会做正确的 Unicode 整理吗?)。

如果您想访问与 <cstring> 函数类似的函数,那么您会发现 std::char_trait<char8_t> to contain some useful ones,尤其是 length(与 strlen 完全一样)和 compare (明确的字典顺序)。 <cstring> 的其余大部分可以通过 C++ 算法充分处理。