GB2312及UTF8编码【转】

时间:2023-01-10 12:27:55

汉字区位码:将汉字定义在一个94行,94列的表中,常用汉字在16-55行,其他汉字在56-87行,符号在1-9区,其他行未定义,其中55行的第90列至94列未定义。比如,“万”字的区位码是45 82, 在45行,82列。

汉字国标码:又称交换码,是一个码集。将区位码的十进制行列值转换成16进制,再分别加上20H得到。举例:将“万”的区位码转换为16进制表示:2D52,分别加上20H得:4D 72,即为国标码。
由此,汉字第一个字节的最小值:10H + 20H =30H, 最大值:57H + 20H = 77H
第二个字节最小值: 01H + 20H = 21H, 最大值: 5EH + 20H = 7EH

GB2312:是一种编码方式,由于国标码和ASC(00H-80H)码重叠,导致计算机无法识别,为解决此问题,将国标码的每个字节最高位置1,使得每个字节大于80H,从而与ASC码区分,这样英文字符和汉字在同一个文件中可以区分开。
由此GB2312编码的汉字第一个字节最小值:30H | 80H = B0H, 最大值:77H | 80H = F7H
第二个字节的最小值: 21H | 80H = A1H, 最大值:7EH | 80H = FEH
因此,GB2312的编码范围是:B0A1H 到F7FEH,B0A1H到F7FEH可以容纳18269个字符,而实际只用了6763个汉字,所以GB2312码并非完全码,存在浪费。
根据GB2312码可以反推区位码,在PHP4.0时代,由于GD库不支持汉字,很多程序就是利用GB2312编码反推区位码,然后根据区位码获取字体文件中汉字的字符点阵数据,然后画图。

GBK:是GB2312的扩充,兼容GB2312,包括了20292个汉字。采用双字节编码,编码范围是 8140H 到FEFEH,可见第一个字节大于80H,可以和ASC码区分开,第二个字节和ASC码存在重叠部分,但可以根据前一个字节是否大于80H进行判定,因此GBK码是兼容ASC码的。

各类编码的范围:
编码  

     高位字节       低位字节
区位码     (10进制)      16-87 1-94
国标码     (16进制)      30H-77H 21H-7EH
GB2312     (16进制)      B0H-F7HA1H-FEH


Unicode:目前采用两个字节编码,理论上可以表示65535个字符,ASC码也采用两字节编码,在每个ASC码前加00H。Unicoe和汉字区位码没有任何关系,只是在65535字符空间的范围内分配了20902个字符给汉字。要将Unicode转换为GB2312或GBK,需要一个映射表,目前网上有各种映射表,可以方便的将Unicode码转换为区位码、国标码、GB2312码等。
提供一个下载链接:http://www.haible.de/bruno/charsets/conversion-tables/GB2312.tar.bz2

UTF-8:直接采用Unicode码的编码称为UTF-16,由于UTF-16中含有00H,对于像Unix这样的操作系统,00H具有特别的意义,容易出现问题。UTF-8很好的解决了这个问题,通过对Unicode进行编码,ASC码仍然采用单字节表示。