char8_t
修复了char
的一些问题,因此我考虑使用char8_t
而不是char
来处理utf8文本(例如命令行中的文本(。但后来我注意到,标准中没有指定strlen
与char8_t
一起使用,实际上cstring库中没有任何函数。我可以期待在下一次标准更新中发生这种情况吗?还是char8_t
从未像我想的那样取代char
?
我是P0482和P1423char8_t
提案的作者。
这些建议的目的是引入char8_t
类型,同时为char16_t
和char32_t
提供相同级别的支持,然后在以后提供附加功能。这些建议是在C++20开发周期后期(分别在圣地亚哥和科隆会议上(通过的,因此没有机会为C++20提供额外的功能。
P1238中描述的SG16指令之一是标准化新的编码感知文本容器和视图类型。这方面的工作正在取得进展,我们希望能在C++23中实现。希望这些新的容器和视图将取代C++中的许多原始字符串处理。
具体地,关于strlen
,strlen
是C API。N2231是向C添加char8_t
支持的提议(同样,与现有的对char16_t
和char32_t
的支持处于相同级别(。14工作组尚未接受这一提议。假设它最终被接受,那么后续使用额外的基于char8_t
的C字符串管理功能是有意义的(也许还可以增强对char16_t
和char32_t
的支持(。
目前,我正在完成N2231在gcc和glibc中的实现。一旦完成,我打算向WG14提交N2231的修订版。
你可以帮忙!SG16是一个开放组。请随时订阅我们的邮件列表,在Slack上加入我们,分享您的想法、需求和愿望,并为新功能撰写建议(我们可以帮助您了解如何做到这一点(。
这些新的字符类型旨在使用C++字符串模板std::basic_string
,即定义std::u8string
。因此,在您的情况下,最好使用C++字符串。
至于char8_t
在cstring库中的未来支持,我认为这个问题更适合未来的C标准。恐怕,这不是一个容易的更新,也不太可能,因为C没有过载的函数,而且这次更新除了strlen
和wcslen
之外,还需要c8slen
等新函数。
char8_t
适用于UTF-8编码的字符串。因此,用户将假设使用它们的API在某种程度上具有Unicode意识。<cstring>
标头的许多内容不适合char8_t
,因为它们的行为与Unicode非常不一致(strcmp
会进行正确的Unicode排序吗?(。
如果您希望访问与<cstring>
函数类似的函数,那么您会发现std::char_trait<char8_t>
包含一些有用的函数,特别是length
(与strlen
完全类似(和compare
(显式字典化(。CCD_ 36的其余大部分可以通过C++算法进行充分处理。
0仍然可以在utf8字符串中充当null终止符,因此从技术上讲,没有什么可以阻止您(除了缺少适当的函数(使用strlen来计算utf8序列中的字节数(!(。如果你想找到字符数,你需要一个单独的函数。