我很高兴看到std::u16string
and std::u32string
在 C++11 中,但我想知道为什么没有std::u8string
处理 UTF-8 情况。我的印象是std::string
是为UTF-8设计的,但似乎做得不太好。我的意思是,不std::string.length()
仍然返回字符串缓冲区的大小而不是字符串中的字符数?
那么,情况如何length()
为新的 C++11 类定义的标准字符串的方法?它们是否返回字符串缓冲区的大小、代码点的数量或字符数(假设代理对是 2 个代码点,但一个字符。如果我错了,请纠正我)?
那么呢size()
;难道它不等于length()
?
See http://en.cppreference.com/w/cpp/string/basic_string/length http://en.cppreference.com/w/cpp/string/basic_string/length为我困惑的根源。
所以,我想,我的根本问题是如何使用std::string
, std::u16string
, and std::u32string
并正确区分缓冲区大小、代码点数量和字符数量?如果您使用标准迭代器,您是否会迭代字节、代码点或字符?
u16string
and u32string
不是“新的 C++11 类”。它们只是 typedefsstd::basic_string
for char16_t
and cha32_t
types.
length
总是等于size
对于任何basic_string
。它的数量是T
在字符串中,其中T
是模板类型basic_string
.
basic_string
不以任何方式、形状或形式识别 Unicode。它没有代码点、字素、Unicode 字符、Unicode 标准化或任何类似的概念。它只是一个有序的序列T
是。唯一可以识别 Unicode 的东西u16string
and u32string
是他们使用返回的类型u""
and U""
文字。因此,它们可以存储 Unicode 编码的字符串,但它们不执行任何需要了解所述编码的操作。
迭代器迭代以下元素T
,而不是“字节、代码点或字符”。如果T
is char16_t
,然后它会迭代char16_t
s。如果字符串是 UTF-16 编码的,则它会迭代 UTF-16 代码单元,而不是 Unicode 代码点或字节。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)