概述
GB2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个字符。
GB2312的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖中国大陆99.75%的使用频率。但对于人名、古汉语等方面出现的罕用字和繁体字,GB2312不能处理,因此后来GBK及GB18030汉字字符集相继出现以解决这些问题。
分区表示
GB2312字符集构成一个94行、94列的二维表,行号称为区号,列号称为位号,每一个汉字或符号在码表中的位置用它所在的区号和位号来表示。这种表示方式也称为区位码。
- 01-09区为特殊符号。
- 16-55区为一级汉字,按拼音排序。
- 56-87区为二级汉字,按部首/笔画排序。
- 10-15区及88-94区则未有编码。
编码原则
- 小于
127的字符意义与原来ASCII码表字符意义相同,127之后的奇异符号们(即EASCII)取消。 - 两个大于
127的字符连在一起时,就表示一个汉字,这样我们就可以组合出大约7000多个简体汉字了,原因后面有详细说明。 - 汉字用两个字节表示,每个字节用七位码,且每个字节高位为
0,前面的一个字节(高字节)从0xA1用到0xF7,后面一个字节(低字节)从0xA1到0xFE。 - 国家标准将汉字和图形符号排列在一个94行94列的二维代码表中,每两个字节分别用两位十进制编码,前字节的编码称为
区码,后字节的编码称为位码,此即区位码。 - 在这些编码里,还把数学符号、罗马希腊的字母、日文的假名们都编进去了,连在ASCII里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的
全角字符,而原来在127号以下的那些就叫半角字符了。
举例来说,啊字是GB2312之中的第一个汉字,它的区位码就是1601,如保字在二维代码表中处于17区第3位,区位码即为1703。
编码详细说明
国标码并不等于区位码,它是由区位码稍作转换得到,其转换方法为(以下数字后的D表示为10进制数字,H则表示此数字为16进制,B表示为字节byte):
- 先将十进制区码和位码转换为十六进制的区码和位码。
- 这样就得了一个与国标码有一个相对位置差的代码。
- 再将这个代码的第一个字节和第二个字节分别加上20H,就得到国标码,相当于如果不转换的话,在两个字节上分别加上32即可。
如:保字的国标码为3123H,它是经过下面的转换得到的:1703D => 1103H => +2020H => 3123H。
国标码是汉字信息交换的标准编码,但因其前后字节的最高位为0,与ASCII码发生冲突,如保字,国标码为31H和23H,而西文字符1和#的ASCII也为31H和23H,现假如内存中有两个字节为31H和23H,这到底是一个汉字,还是两个西文字符1和#呢?于是就出现了二义性,显然,国标码是不可能在计算机内部直接采用的,于是,汉字的机内码采用变形国标码,其变换方法为: