目录
basic_string、u16string 、u32string 、wstring
string类的介绍
1. string类是表示字符序列的类
2. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。
3. string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型
4. string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits和allocator作为basic_string的默认参数
5. 注意,这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个 类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。
从cplusplus文档上也可以查阅到string类的相关信息。
编码
string类是basic_string模板类的一个实例,为什么这里是basic_string<char>,这就涉及到编码了。
我们最早接触到的编码应该是ASCLL码了,它也称美国信息交换标准代码。
为什么会存在ASCLL码呢?————我们知道计算机的世界只有0和1,没有字母,那么要将字母显示出来就只能将其转化为数字让计算机识别,因此有了ASCLL码。
因为英文单词由字母组成,所以要表达英文、数字、符号只需要128个数字符号即可。
但是世界上不只英文一种语言,还有汉语、日语.......因此为了让世界计算机科学联系在一起共同促进发展,产生了一种编码: Unicode(统一码,万国码)
Unicode 又有多种形式以适应不同语言:UTF-8、UTF-16、UTF-32。
其中UTF-8使用最为广泛,因为它可以对不同范围的字符使用不同长度的编码,较为灵活;并且它可以兼容ASCLL码。
UTF-16一个字符以2字节一单位,UTF-32则是4字节一单位。
还有一种码GBK(称为国码)也就是我国编的编码,因为外国人对博大精深的中文理解毕竟不如国人,所以我们自己编了适合中文的编码GBK。
像中文就是一个汉字是两字节的,也就需要两个码位来表示。
s1[0][1]是第一个字,[2][3]是第二个字。至于为什么编码为负,因为这和编码的开头有关系,它需要兼容ASCLL,如果是正的就无法区分是一个一个的ASCLL编码还是汉字编码了。
汉字编码也是有讲究的,将谐音字等放在了一起方便编码。
basic_string、u16string 、u32string 、wstring
上面说了UTF-8是使用最广泛的编码方式,basic_string就是基础这种编码方式:
u16string是UTF-16
u32string是UTF-32
wstring是c++98的,也是两个字节为一单位,与UTF-16类似
总之不同的编码方式对应不同的string,它们接口都差不多,学会一个其余的也都能掌握。
string类是basic_string模板类的一个实例,它是动态增长的字符数组,原型:
template <class T>
class basic_string
{
private:
T* str;
size_t capacity;
size_t size;
};
typedef basic_string<char> string;
为什么这里用T,因为不确定一个字符是多大,可能是一个字节,也可能是两个字节大小,对应不同的编码方式。所以这里也不知道字符串类型是什么,因此才说它是动态增长的字符数组。