14

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

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

那怎么样size()?不等于length()吗?请参阅http://en.cppreference.com/w/cpp/string/basic_string/length了解我的困惑的来源。

所以,我想,我的基本问题是如何使用std::string,std::u16stringstd::u32string正确区分缓冲区大小、代码点数和字符数?如果您使用标准迭代器,您是在迭代字节、代码点还是字符?

4

3 回答 3

18

u16string并且u32string不是“新的 C++11 类”。它们只是std::basic_stringforchar16_tcha32_t类型的 typedef。

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

basic_string不以任何方式、形状或形式识别 Unicode。它没有代码点、字素、Unicode 字符、Unicode 规范化或任何类似的概念。它只是Ts 的有序序列。唯一能识别 Unicode 的u16string就是u32string它们使用由u""U""字面量返回的类型。因此,它们可以存储 Unicode 编码的字符串,但它们不做任何需要知道所述编码的事情。

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

于 2012-09-03T16:37:44.573 回答
1

All the string types do the same thing: they hold a sequence of elements, each of whose type is the character type for the string. length() and size() both return the number of elements. Iterators iterator over elements. Higher-level analysis, such as figuring out the number of characters, require much more complex calculations.

于 2012-09-03T16:29:09.783 回答
0

目前,标准中没有内置任何内容来区分代码单元、代码点或单个字节。但是,似乎确实有一些东西正在处理这类事情。根据标准委员会的决定,它可能是 TR2 或下一个标准的一部分。

于 2012-11-29T07:32:09.133 回答