我很高兴看到C ++ 11中的std::u16string
和std::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::string
,std::u16string
和std::u32string
并正确区分缓冲区大小,代码点数和字符数?如果使用标准迭代器,是否要迭代字节,代码点或字符?
答案 0 :(得分:17)
u16string
和u32string
不是“新的C ++ 11类”。它们只是std::basic_string
和char16_t
类型cha32_t
的typedef。
length
, size
始终等于basic_string
。它是字符串中T
的数量,其中T
是basic_string
的模板类型。
basic_string
不以任何方式,形状或形式识别Unicode。它没有代码点,字形,Unicode字符,Unicode规范化或任何类型的概念。它只是T
s的有序序列。关于u16string
和u32string
,唯一知道Unicode的是他们使用u""
和U""
文字返回的类型。因此,它们可以存储Unicode编码的字符串,但它们不需要知道所述编码。
迭代器迭代T
的元素,而不是“字节,代码点或字符”。如果T
为char16_t
,那么它将迭代char16_t
秒。如果字符串是UTF-16编码的,那么它将遍历UTF-16代码单元,而不是Unicode代码点或字节。
答案 1 :(得分:1)
所有字符串类型都做同样的事情:它们包含一系列元素,每个元素的类型都是字符串的字符类型。 length()
和size()
都返回元素数量。迭代器迭代元素。更高级别的分析,例如计算字符数,需要更复杂的计算。
答案 2 :(得分:0)
目前,标准中没有任何内容可以区分代码单元,代码点或单个字节。但是,似乎有一些事情要处理this sort of thing。根据标准委员会的决定,它可能是TR2或下一个标准的一部分。