std::u16string、std::u32string、std::string、length()、size()、代码点和字符

2024-02-13

我很高兴看到std::u16string and std::u32string在 C++11 中,但我想知道为什么没有std::u8string处理 UTF-8 情况。我的印象是std::string是为UTF-8设计的,但似乎做得不太好。我的意思是,不std::string.length()仍然返回字符串缓冲区的大小而不是字符串中的字符数?

那么,情况如何length()为新的 C++11 类定义的标准字符串的方法?它们是否返回字符串缓冲区的大小、代码点的数量或字符数(假设代理对是 2 个代码点,但一个字符。如果我错了,请纠正我)?

那么呢size();难道它不等于length()? See http://en.cppreference.com/w/cpp/string/basic_string/length http://en.cppreference.com/w/cpp/string/basic_string/length为我困惑的根源。

所以,我想,我的根本问题是如何使用std::string, std::u16string, and std::u32string并正确区分缓冲区大小、代码点数量和字符数量?如果您使用标准迭代器,您是否会迭代字节、代码点或字符?


u16string and u32string不是“新的 C++11 类”。它们只是 typedefsstd::basic_string for char16_t and cha32_t types.

length总是等于size对于任何basic_string。它的数量是T在字符串中,其中T是模板类型basic_string.

basic_string不以任何方式、形状或形式识别 Unicode。它没有代码点、字素、Unicode 字符、Unicode 标准化或任何类似的概念。它只是一个有序的序列T是。唯一可以识别 Unicode 的东西u16string and u32string是他们使用返回的类型u"" and U""文字。因此,它们可以存储 Unicode 编码的字符串,但它们不执行任何需要了解所述编码的操作。

迭代器迭代以下元素T,而不是“字节、代码点或字符”。如果T is char16_t,然后它会迭代char16_ts。如果字符串是 UTF-16 编码的,则它会迭代 UTF-16 代码单元,而不是 Unicode 代码点或字节。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

std::u16string、std::u32string、std::string、length()、size()、代码点和字符 的相关文章

随机推荐