2.3 字符和字符串

字符串是由多个字符按照一定排列顺序组成的,在C++中,以'\0'作为字符串结束标记。每个字符都记录在一张表中,它们各自对应一个唯一编号,系统通过这些编号查找到对应的字符并显示。字符表格中的编号便是字符的编码格式。

2.3.1 字符的编码

在C++中,字符的编码格式分两种:ASCII和Unicode。Unicode是ASCII的升级编码格式,它弥补了ASCII的不足,也是未来编码格式的趋势。

ASCII编码在内存中占一个字节大小,由0~255之间的数字组成。每个数字表示一个符号,具体表示方式可查看ASCII表。由于ASCII编码也是由数字组成的,故可以和整型互相转换,但整数不可超过ASCII的最大表示范围,因为多余部分将被舍弃。

由于ASCII原来的表示范围太小,只能表示英文的26个字母和常用符号。在亚洲,ASCII的表示范围完全不够用。仅汉字就足够占满ASCII编码。因此,占双字节、表示范围为0~65535的Unicode编码产生了。Unicode编码是世界通用的编码,ASCII编码也包含在其中。

在Microsoft Visual C++6.0中,使用char定义ASCII编码格式的字符,使用wchar_t定义Unicode编码格式的字符。wchar_t中保存ASCII编码,不足位补0。如字符'a'的ASCII编码为0x61,Unicode编码为0x0061。汉字的编码方式有些特殊,ASCII与Unicode都有与之匹配的编码格式。

在程序中使用中文、韩文、日文等时,经常出现显示的内容都是乱码的情况。这是因为系统中缺少程序中所需语种的字符表,而这个字符表是用于解释所需语种的字符编码的,所以程序中的字符编码错误地对应到其他字符表中,显示出的文字是其他语种字符表中的信息。

ASCII编码与Unicode编码都可以用来存储汉字,但是它们对汉字的编码方式各不相同,所以存储同样的汉字,它们在内存中的编码是不同的,如图2-5所示。

图 2-5 汉字字符串

ASCII使用GB2312-80,又叫汉字国标码,保存了6763个常用汉字编码,用两个字节来表示一个汉字。在GB2312-80中用区和位来定位,第一个字节保存每个区,共94个区;第二个字节保存每个区中的位,共94位。详细信息可查看GB2312-80编码的说明。

Unicode使用UCS-2编码格式,最多可存储65536个字符。汉字博大精深,其中有简体字、繁体字,以及网络中流行的火星文,它们的总和远远超过了UCS-2的存储范围,所以UCS-2编码格式中只保存了常用字。为了将所有的汉字都容纳进来,Unicode也采用了与ASCII类似的方式—用两个Unicode编码解释一个汉字,称之为UCS-4编码格式。UCS-2编码表的使用和ASCII码表的使用是一样的。每个数字编号在表中对应一个汉字,从0x4E00到0x9520为汉字编码区。例如,在UCS-2中,“烫”字的编码为0x70EB。更多关于UCS-2编码的信息可查看随书文件的UCS-2编码表。

Microsoft Visual C++6. 0为了使char与wchar_t通用,使用了预编译宏TCHAR来代替它们,TCHAR会根据编译选项定义对应的字符类型。