Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::u16string、std::u32string、std::string、length()、size()、代码点和字符_C++_Unicode - Fatal编程技术网

C++ std::u16string、std::u32string、std::string、length()、size()、代码点和字符

C++ std::u16string、std::u32string、std::string、length()、size()、代码点和字符,c++,unicode,C++,Unicode,我很高兴在C++11中看到std::u16string和std::u32string,但我想知道为什么没有std::u8string来处理UTF-8的情况。我的印象是,std::string是为UTF-8设计的,但它似乎做得不太好。我的意思是,std::string.length()是否仍然返回字符串缓冲区的大小而不是字符串中的字符数 那么,如何为新的C++11类定义标准字符串的length()方法呢?它们是否返回字符串缓冲区的大小、代码点的数量或字符的数量(假设代理项对是2个代码点,但只有一个

我很高兴在C++11中看到
std::u16string
std::u32string
,但我想知道为什么没有
std::u8string
来处理UTF-8的情况。我的印象是,
std::string
是为UTF-8设计的,但它似乎做得不太好。我的意思是,
std::string.length()
是否仍然返回字符串缓冲区的大小而不是字符串中的字符数

那么,如何为新的C++11类定义标准字符串的
length()
方法呢?它们是否返回字符串缓冲区的大小、代码点的数量或字符的数量(假设代理项对是2个代码点,但只有一个字符。如果我错了,请纠正我)

那么
size()
呢;它不等于
length()
? 看看我困惑的根源


所以,我想,我的基本问题是如何使用
std::string
std::u16string
std::u32string
并正确区分缓冲区大小、代码点数量和字符数量?如果使用标准迭代器,是否对字节、码点或字符进行迭代?

所有字符串类型都执行相同的操作:它们包含一系列元素,每个元素的类型都是字符串的字符类型
length()
size()
都返回元素数。迭代器对元素进行迭代器。更高层次的分析,如计算字符数,需要更复杂的计算。

u16string
u32string
不是“新的C++11类”。它们只是
std::basic_string
的typedef,用于
char16_t
cha32_t
类型

对于任何
基本字符串
长度始终等于
大小
。它是字符串中
T
的数目,其中
T
基本字符串的模板类型

basic_string
不以任何方式、形状或形式识别Unicode。它没有码点、字形、Unicode字符、Unicode规范化或任何类似的概念。它只是一个
T
s的有序序列。Unicode对
u16string
u32string
唯一了解的是,它们使用
u”“
u”“
文本返回的类型。因此,它们可以存储Unicode编码的字符串,但它们不做任何需要所述编码知识的事情


迭代器迭代
T
的元素,而不是“字节、码点或字符”。如果
T
char16\u T
,则它将迭代
char16\u T
s。如果字符串是UTF-16编码的,那么它是在UTF-16代码单元上迭代,而不是在Unicode代码点或字节上迭代。

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

std::string
对utf8的作用与u16string对utf16的作用相同:它处理相应类型的元素,并且不处理由多个元素的序列表示的字符。转到此处:和代码单元!=代码点。它们是两个不同的概念。仅供以后参考,因为我不知道。。。