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

flvlnr44  于 2022-12-24  发布在  其他
关注(0)|答案(4)|浏览(162)

C++20中的char8_t修复了char的一些问题,因此我考虑使用char8_t而不是char来处理utf8文本(Eidogg.来自命令行的文本)。但后来我注意到strlen并没有在标准中指定与char8_t一起使用,实际上cstring库中没有一个函数是这样的。我能期望这在下一个标准更新中发生吗?或者char8_t从来没有打算以我所想的方式取代char

wdebmtf2

wdebmtf21#

我是P0482P1423char8_t提案的作者。
这些提案的目的是引入char8_t类型,并提供与char16_tchar32_t相同的支持级别,然后在以后提供额外的功能。这些提案是在C20开发周期的后期(分别在圣地亚哥和科隆会议上)采用的,因此没有机会为C20提供额外的功能。
P1238中描述的SG16指令之一是标准化新的编码感知文本容器和视图类型。这方面的工作正在进行中,我们希望将其交付给C23。希望这些新的容器和视图将取代C中的许多原始字符串处理。
具体到strlenstrlen是一个C API。N2231是一个将char8_t支持添加到C(同样,与char16_tchar32_t的现有支持处于同一级别)。该建议尚未被WG 14接受。假设最终被接受,那么接下来就有必要使用额外的基于char8_t的C字符串管理函数(也许还可以增强对char16_tchar32_t的支持)。
目前,我正在gcc和glibc中完成N2231的实现,一旦完成,我打算向WG 14提交N2231的修订版。
您可以提供帮助!SG16是一个开放的群组。请随时订阅我们的邮件列表,在Slack上加入我们,分享您的想法、需求和愿望,并为新功能撰写建议(我们可以帮助您实现这些)。

blmhpbnm

blmhpbnm2#

这些新的char类型是为了使用C字符串模板std::basic_string,也就是定义std::u8string,所以最好使用C字符串。
至于cstring库将来对char8_t的支持,我想这个问题更适合未来的C标准,恐怕这不会是一个容易的,也不太可能的更新,因为C没有重载函数,这次更新除了strlenwcslen之外,还需要c8slen这样的新函数。

omvjsjqw

omvjsjqw3#

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++算法来处理。

ha5z0ras

ha5z0ras4#

0仍然可以作为utf8字符串中的空终止符,所以从技术上讲,没有什么可以阻止你(除了缺少合适的函数)使用strlen来计算utf8序列中的字节数(!)。如果你想找到字符数,你需要一个单独的函数。

相关问题