3.3 字符类QChar
3.3.1 QChar的编码
QChar类是Qt中用于表示一个字符的类,实现在QtCore共享库中。QChar类的内部用两个字节的Unicode编码来表示一个字符。
我们知道,char类型是C/C++中内置的类型,用字节来解析内存的信息。比如:
char gemfield='g';
gemfield标记的这块内存的大小就是一个字节,存储的信息就是01100111(即103,103是字符'g'的ASCII码值。又比如:
char gemfield='汉';
gemfield标记的这块内存的大小依然是一个字节,存储的信息是0xBA,这是因为在Windows系统中汉字是以GBK编码来存储的,“汉”这个字的编码是0xBABA,因为char只有一个字节,所以就只把低字节存储过来。
Qchar类是Qt处理字符的基本类型,是对Unicode字符的封装。QChar类使用2个字节的内存,在其内部维护了一个unsigned short类型的内存(大多数的编译工具也会把它当作unsigned short类型)。使用的是ucs-2标准。
QChar类封装一个char类型是相当容易理解的,char类型作为QChar的构造参数时会被转换为unsigned short,继而可被QChar接管。
QChar类封装一个unsigned short类型也是容易理解的,比如:
QChar gemfield=0x6C49; //0x6C49是"汉"字的Unicode编码
Qt内部使用的是Unicode表,所以gemfield可以被成功解析出“汉”这个字。而下面这种情况是QChar类不能处理的:
QChar gemfield = '汉';
Windows上的“汉”(以及其他中文字符)采用的编码是GBK编码,值为0xBABA。QChar维护的unsigned short内存上的信息便是0xBABA,但这个值并不是Unicode编码(Unicode表中的'汉'对应的编码值是0x6C49),所以解析不了。但是,QChar可以通过Unicode()函数返回一个字符的Unicode编码。关于Unicode编码知识,我们将在后续章节进行介绍。
3.3.2 Qchar类的接口
1. QChar类的构造函数
QChar类提供了多个不同原型的构造函数(即具有不同的函数声明形式),以方便不同场合下使用。
2. QChar类的字符判断
QChar类提供了很多成员函数,可以对字符的类型进行判断,比如:
3. QChar类的数据转换
QChar类提供了一些成员函数用于数据的转换,比如:
注意,这几个函数都不会改变对象自身的内容,转换的结果通过返回值反映出来(即基于复制内容的转换)。
4. QChar类的字符比较
Qt中定义了一些与QChar类相关的比较运算符,比如:
5. QChar类与char类型的相互转化
QChar转换为char,可以利用下列2个成员函数:
char toLatin1(); char toAscii();
比如:
char ch; qchar qch; ch = qch.toLatin1();
char转换为QChar,可以利用下列2个成员(构造)函数:
QChar(char ch); QChar (uchar ch);