首页 文章

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

提问于
浏览
12

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

3 回答

  • 1

    u16stringu32string 不是"new C++11 classes" . 对于 char16_tcha32_t 类型,它们只是 std::basic_string 的typedef .

    对于任何 basic_stringlength 始终等于 size . 它是字符串中 T 的数量,其中 Tbasic_string 的模板类型 .

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

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

  • 0

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

  • 17

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

相关问题