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);