我很高兴看到C 11中的 std::u16string
和 std::u32string
,但我想知道为什么没有 std::u8string
处理UTF-8的情况 . 我的印象是 std::string
适用于UTF-8,但是它仍然没有返回字符串缓冲区的大小而不是字符串中的字符数?
那么,如何为新的C 11类定义标准字符串的 length()
方法呢?他们是否返回字符串's buffer, the number of codepoints, or the number of characters (assuming a surrogate pair is 2 code points, but one character. Please correct me if I' m的大小错误)?
那怎么样 size()
;是不是等于 length()
?请参阅http://en.cppreference.com/w/cpp/string/basic_string/length以了解我的困惑 .
所以,我想,我的基本问题是如何使用 std::string
, std::u16string
和 std::u32string
并正确区分缓冲区大小,代码点数和字符数?如果使用标准迭代器,是否要迭代字节,代码点或字符?
3 回答
u16string
和u32string
不是"new C++11 classes" . 对于char16_t
和cha32_t
类型,它们只是std::basic_string
的typedef .对于任何
basic_string
,length
始终等于size
. 它是字符串中T
的数量,其中T
是basic_string
的模板类型 .basic_string
不以任何方式,形状或形式识别Unicode . 它没有代码点,字形,Unicode字符,Unicode规范化或任何类型的概念 . 它只是T
的有序序列 . 关于u16string
和u32string
,唯一能识别Unicode的是它们使用u""
和U""
文字返回的类型 . 因此,它们可以存储Unicode编码的字符串,但它们不需要知道所述编码 .迭代器迭代
T
的元素,而不是"bytes, codepoints, or characters" . 如果T
是char16_t
,那么它将迭代char16_t
. 如果字符串是UTF-16编码的,那么它将迭代UTF-16代码单元,而不是Unicode代码点或字节 .所有字符串类型都做同样的事情:它们包含一系列元素,每个元素的类型都是字符串的字符类型 .
length()
和size()
都返回元素数量 . 迭代器迭代元素 . 更高级别的分析,例如计算字符数,需要更复杂的计算 .目前,标准中没有任何内容可以区分代码单元,代码点或单个字节 . 但是,似乎有些事情正在处理this sort of thing . 根据标准委员会的决定,它可能是TR2或下一个标准的一部分 .