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

Ver*_*rax 12 c++ unicode

我很高兴看到C++ 11中的std::u16stringstd::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::u16string以及std::u32string和缓冲区大小,码点的数量和字符数正确区分?如果使用标准迭代器,是否要迭代字节,代码点或字符?

Nic*_*las 17

u16stringu32string不是"新的C++ 11类".它们只是std::basic_stringfor char16_tcha32_t类型的typedef .

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

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

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

  • 在Unicode术语中,`T` ="代码单元". (5认同)