std::u16string、std::u32string和std::string分别代表什么意思?length()和size()有何区别?codepoints和characters又是什么?

14
我很高兴看到C++11中出现了std::u16stringstd::u32string,但我想知道为什么没有std::u8string来处理UTF-8的情况。我认为std::string是用于UTF-8的,但它似乎做得不太好。我的意思是,std::string.length()返回的仍然是字符串缓冲区的大小,而不是字符串中字符的数量。
那么,新的C++11类的length()方法是如何定义的呢?它们返回字符串缓冲区的大小、码点的数量还是字符的数量(假设代理对是2个码点,但一个字符,请纠正我如果我错了)? size()呢?它不等于length()吗?请参见http://en.cppreference.com/w/cpp/string/basic_string/length以获取我困惑的来源。
所以,我想问的根本问题是如何使用std::stringstd::u16stringstd::u32string,并正确区分缓冲区大小、码点数量和字符数量?如果使用标准迭代器,是在遍历字节、码点还是字符?

3
std::string 对于 utf8 和 u16string 对于 utf16 都可以正常工作:它处理相应类型的元素,并且不处理由多个元素表示的字符。 - Pete Becker
请访问此处:http://utf8everywhere.org/#myth.strlen - Pavel Radzivilovsky
3个回答

18

u16stringu32string并不是"新的C++11类",它们只是std::basic_string关于char16_tcha32_t类型的typedef。

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

basic_string在任何方面都不具备Unicode意识,没有码点、字形、Unicode字符、Unicode归一化或任何相关概念。它只是一系列有序的T。唯一与Unicode相关的是u16stringu32string使用u""U""字面量返回的类型。因此,它们可以存储Unicode编码的字符串,但不需要了解该编码所需的知识。

迭代器迭代T元素,而不是"字节、码点或字符"。如果Tchar16_t,那么它将迭代char16_t。如果字符串是UTF-16编码的,则它正在迭代UTF-16代码单元,而不是Unicode代码点或字节。


1
而且 代码单元 不等于 代码点。它们是两个不同的概念。只是为了以后参考,因为我之前并不知道这一点... - eonil

1
所有的字符串类型都有相同的功能:它们保存一系列元素,每个元素的类型都是该字符串的字符类型。 length()size() 都返回元素的数量。迭代器遍历元素。更高级的分析,例如计算字符数,需要进行更复杂的计算。

0

目前标准中并没有任何机制可以区分代码单元、代码点或是单个字节。然而,似乎已经有相关计划来处理这类情况。根据标准委员会的决定,它可能会成为TR2或是下一个标准的一部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接