ASCII/GB2312/GBK/unicode常用字符集编码详解

ASCII/GB2312/GBK/unicode等常用字符集编码详解

ASCII/GB2312/GBK/unicode常用字符集编码详解


ASCII
ASCII码是7位编码 , 编码范围是0x00-0x7F 。ASCII字符集包括英文字母、阿拉伯数字和标点符号等字符 。其中0x00-0x20和0x7F共33个控制字符 。
只支持ASCII码的系统会忽略每个字节的高到位 , 只认为低7位是有效位 。HZ字符编码就是早期为了在只支持7位ASCII系统中传输中文而设计的编码 。早期很多邮件系统也只支持ASCII编码 , 为了传输中文邮件必须使用BASE64或者其他编码方式 。
GB2312
GB2312是基于区位码设计的 , 区位码把编码表分为94个区 , 每个区对应94个位 , 每个字符的区号和位号组合起来就是该汉字的区位码 。区位码一般 用10进制数来表示 , 如1601就表示16区1位 , 对应的字符是“啊” 。在区位码的区号和位号上分别加上0xA0就得到了GB2312编码 。
区位码中01-09区是符号、数字区 , 16-87区是汉字区 , 10-15和88-94是未定义的空白区 。它将收录的汉字分成两级:第一级是常用汉字计3755个 , 置于16-55区 , 按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字计3008个 , 置于56-87区 , 按部首/笔画顺序排列 。一级汉字是按照拼音排序的 , 这个就可以得到某个拼音在一级汉字区位中的范围 , 很多根据汉字可以得到拼音的程序就是根据这个原理编写的 。
GB2312字符集中除常用简体汉字字符外还包括希腊字母、日文平假名及片假名字母、俄语西里尔字母等字符 , 未收录繁体中文汉字和一些生僻字 。可以用繁体汉字测试某些系统是不是只支持GB2312编码 。
GB2312的编码范围是0xA1A1-0x7E7E , 去掉未定义的区域之后可以理解为实际编码范围是0xA1A1-0xF7FE 。
EUC-CN可以理解为GB2312的别名 , 和GB2312完全相同 。
区位码更应该认为是字符集的定义 , 定义了所收录的字符和字符位置 , 而GB2312及EUC-CN是实际计算机环境中支持这种字符集的编码 。HZ和ISO-2022-CN是对应区位码字符集的另外两种编码 , 都是用7位编码空间来支持汉字 。区位码和GB2312编码的关系有点像 Unicode和UTF-8 。
GBK
GBK编码是GB2312编码的超集 , 向下完全兼容GB2312 , 同时GBK收录了Unicode基本多文种平面中的所有CJK汉字 。同 GB2312一样 , GBK也支持希腊字母、日文假名字母、俄语字母等字符 , 但不支持韩语中的表音字符(非汉字字符) 。GBK还收录了GB2312不包含的汉字部首符号、竖排标点符号等字符 。
GBK的整体编码范围是为0x8140-0xFEFE , 不包括低字节是0×7F的组合 。高字节范围是0×81-0xFE , 低字节范围是0x40-7E和0x80-0xFE 。
低字节是0x40-0x7E的GBK字符有一定特殊性 , 因为这些字符占用了ASCII码的位置 , 这样会给一些系统带来麻烦 。
有些系统中用0x40-0x7E中的字符(如“|”)做特殊符号 , 在定位这些符号时又没有判断这些符号是不是属于某个 GBK字符的低字节 , 这样就会造成错误判断 。在支持GB2312的环境下就不存在这个问题 。需要注意的是支持GBK的环境中小于0x80的某个字节未必就是ASCII符号;另外就是较好选用小于0×40的ASCII符号做一些特殊符号 , 这样就可以快速定位 , 且不用担心是某个汉字的另一半 。Big5编码中也存在相应问题 。
CP936和GBK的有些许差别 , 绝大多数情况下可以把CP936当作GBK的别名 。
GB18030
GB18030编码向下兼容GBK和GB2312 , 兼容的含义是不仅字符兼容 , 而且相同字符的编码也相同 。GB18030收录了所有Unicode3.1中的字符 , 包括中国少数民族字符 , GBK不支持的韩文字符等等 , 也可以说是世界大多民族的文字符号都被收录在内 。

推荐阅读