【问题标题】:std::u16string, std::u32string, std::string, length(), size(), codepoints and charactersstd::u16string、std::u32string、std::string、length()、size()、码点和字符
【发布时间】:2012-09-03 16:25:04
【问题描述】:

我很高兴在 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 并正确区分缓冲区大小、代码点数和字符数?如果您使用标准迭代器,您是在对字节、代码点还是字符进行迭代?

【问题讨论】:

  • std::stringu16string 对 utf16 一样适用于 utf8:它处理相应类型的元素,而不处理由多个元素的序列表示的字符.

标签: c++ unicode


【解决方案1】:

u16stringu32string 不是“新的 C++11 类”。它们只是 std::basic_string 的类型定义,用于 char16_tcha32_t 类型。

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

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

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

【讨论】:

  • 代码单元 != 代码点。它们是两个不同的概念。仅供以后参考,因为我不知道...
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2014-09-17
      • 2011-09-24
      • 1970-01-01
      • 2010-10-28
      • 2015-01-07
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      • 2016-03-29
      相关资源
      最近更新 更多