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

时间:2012-09-03 16:25:04

标签: c++ unicode

我很高兴看到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 个答案:

答案 0 :(得分:17)

u16stringu32string不是“新的C ++ 11类”。它们只是std::basic_stringchar16_t类型cha32_t的typedef。

对于任何length

size始终等于basic_string。它是字符串中T的数量,其中Tbasic_string的模板类型。

basic_string不以任何方式,形状或形式识别Unicode。它没有代码点,字形,Unicode字符,Unicode规范化或任何类型的概念。它只是T s的有序序列。关于u16stringu32string,唯一知道Unicode的是他们使用u""U""文字返回的类型。因此,它们可以存储Unicode编码的字符串,但它们不需要知道所述编码。

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

答案 1 :(得分:1)

所有字符串类型都做同样的事情:它们包含一系列元素,每个元素的类型都是字符串的字符类型。 length()size()都返回元素数量。迭代器迭代元素。更高级别的分析,例如计算字符数,需要更复杂的计算。

答案 2 :(得分:0)

目前,标准中没有任何内容可以区分代码单元,代码点或单个字节。但是,似乎有一些事情要处理this sort of thing。根据标准委员会的决定,它可能是TR2或下一个标准的一部分。