信息传递、编码和计算机表示(三)

来源:互联网 发布:网络adb手机刷机 编辑:程序博客网 时间:2024/06/10 15:10

概要:

信息传递、编码和计算机表示(二) 中讲述了ASCII和Extended ASCII。 本篇将分析中文如何编码。

 

 

如果中国人要使用计算机处理和显示中文,自然就涉及到中文在计算机中如何编码的问题。由于ASCII占用一个字节的低7bit(0x00-0x7F),Extended ASCII完全使用了一个字节的8bit。 并且一个字节只能表示2^8 = 256种情况,而常用汉字有7000多个,很明显一个字节是表达不了这么多情况的,那么2个字节呢,2个字节总共16bit,可以表示2^16 = 65536种情况,这就可以满足编码需求了。于是,便有了2字节码。

 

一、GB2312码

<!--以下引用自 http://tester2test.blog.51cto.com/461899/137617 -->

GB2312 是汉字字符集和编码的代号,中文全称为“信息交换用汉字编码字符集”,由中华人民共和国国家标准总局发布,一九八一年五月一日实施。GB 是“国标” 二字的汉语拼音缩写。
GB2312 字符集 (character set) 只收录简化字汉字(见备注1),以及一般常用字母和符号,主要通行于中国大陆地区和新加坡等地。
GB2312 共收录有 7445 个字符,其中简化汉字 6763 个,字母和符号 682 个。
GB2312 将所收录的字符分为 94 个区,编号为 01 区至 94 区;每个区收录 94 个字符,编号为 01 位至 94 位。GB2312 的每一个字符都由与其唯一对应的区号和位号所确定。例如:汉字“啊”,编号为 16 区 01 位。
GB2312 字符集的区位分布表:
区号    字数    字符类别
01      94    一般符号
02      72    顺序号码
03      94    拉丁字母
04      83    日文假名
05      86    Katakana
06      48    希腊字母
07      66    俄文字母
08      63    汉语拼音符号
09      76    图形符号
10-15            备用区
16-55    3755    一级汉字,以拼音为序
56-87    3008    二级汉字,以笔划为序
88-94            备用区
GB2312 编码
GB2312 原始编码 (encoding) 是对所收录的每个字符都用两个字节 (byte) 表示。第一字节为“高字节”,由字符的区号值加上 32 而形成;第二字节为“低字节”,由字符的位号值加上 32 而形成。例如:汉字“啊”,编号为 16 区 01 位。它的高字节为 16 + 32 = 48 (0x30),低字节为 01 + 32 = 33 (0x21),合并而成的编码为 0x3021。 (见备注2)
在区位号值上加 32 的原因大慨是为了避开低值字节区间。
由于 GB2312 原始编码与 ASCII 编码的字节有重叠,现在通行的 GB2312 编码是在原始编码的两个字节上各加 128 修改而形成。例如:汉字“啊”,编号为 16 区 01 位。它的原始编码为 0x3021,通行编码为 0xB0A1。 (见备注3)
如果不另加说明,GB2312 常指这种修改过的编码。
<!-- 引用结束 -->
 备注:
1、GB2312,只收录了简化字,繁体字没法再这个编码区来表示
2、这里建议不要说高字节,低字节,容易和Big Endian和Little Endian混淆。 说成是第一个字节、 第二个字节比较贴切。
3、上面说在区位号上要加上32,这个是有原因的。 请看前一篇Extended ASCII Latin-1,128开始的32个(128-159)是控制字符。避免传输的时候有问题,所以要避免使用该区的编码。加上128,也就是在最高的第8位置1,避免和ASCII码(0x00-0x7F)的冲突。
4、GB2312是和ASCII兼容的。由于ASCII码占用7位的历史原因,所以这种聪明的编码方式规定:对于连续的2个字节,只有在2个字节的最高bit都是1的情况下,才认为这2个字节合起来表示一个汉字。这样不同长度混排的编码方法,通常被叫做"MBCS(Muilti-Bytes Charecter Set,多字节字符集)",如"中文ABC"这串文本,它所占用的字节数可能就是:2×2+3=7,如下图所示。
MBCS下中文与字
二、GBK和GB18030
GBK,GB18030由GB2312扩展而来。
<!--引用自:http://zh.wikipedia.org/zh-cn/GBK-->

1993年Unicode 1.1版本推出,收录了中国大陆台湾日本韩国通用字符集汉字,总共有20,902个。

中国大陆订定了等同于Unicode 1.1版本的“GB 13000.1-93”“信息技术 通用多八位编码字符集(UCS)第一部分:体系结构与基本多文种平面”。

由于GB 2312-80只收录了6763个汉字,有不少汉字,如部分在GB 2312-80推出以后才简化的汉字(如“啰”),部分人名用字(如中国前总理朱镕基的“镕”字),台湾及香港使用的繁体字日语朝鲜语汉字等,并未有收录在内。中文电脑开发商,于是利用了GB 2312-80未有使用的编码空间,收录了所有出现在Unicode 1.1及GB 13000.1-93之中的汉字,制定了GBK编码。

根据西方资料,GBK最初是由微软对GB2312的扩展,也就是CP936字码表 (Code Page 936)的扩展(原来的CP936和GB 2312-80一模一样),最初出现于Windows 95简体中文版中,由于Windows产品的流行和在大陆广泛被使用,中华人民共和国国家有关部门将其作为技术规范。注意GBK并非国家正式标准,只是国家技术监督局标准化司、电子工业部科技与质量监督司发布的“技术规范指导性文件”。虽然GBK收录了所有Unicode 1.1及GB 13000.1-93之中的汉字,但是编码方式与Unicode 1.1及GB 13000.1-93不同。仅仅是GB 2312到GB 13000.1-93之间的过渡方案。

<!-- 引用结束-->

 

<!-- 引用自:http://zh.wikipedia.org/wiki/GB_18030 -->

GB 18030,全称:国家标准GB 18030-2005《信息技术 中文编码字符集》,是中华人民共和国现时最新的内码字集,是GB 18030-2000《信息技术 信息交换用汉字编码字符集 基本集的扩充》的修订版。与GB 2312-1980完全兼容,与GBK基本兼容,支持GB 13000Unicode的全部统一汉字,共收录汉字70244个。

GB 18030主要有以下特点:

  • UTF-8 相同,采用多字节编码,每个字可以由1个、2个或4个字节组成。
  • 编码空间庞大,最多可定义161万个字符。
  • 支持中国国内少数民族的文字,不需要动用造字区。
  • 汉字收录范围包含繁体汉字以及日韩汉字

本规格的初版使中华人民共和国信息产业部电子工业标准化研究所起草,由国家质量技术监督局于2000年3月17日发布。现行版本为国家质量监督检验总局和中国国家标准化管理委员会于2005年11月8日发布,2006年5月1日实施。此规格为在中国境内所有软件产品支持的强制规格。

<!-- 引用结束-->

 

三、编码之间的关系

ASCII、GB2312、GBK的关系如下图:

备注:兼容就是说对于“中文123”这样可以通过GB2312进行编码的内容,通过GBK或者GB18030编码的结果和GB2312编码是一样的。

 

四、打印GB2312的编码

按照上面说的GB2312编码规则,可以打印这些汉字,C代码如下:

 

 

例如调用print_gb2312_pk(16, 55, 1, 94);输出 “16-55    3755    一级汉字,以拼音为序”的汉字,输出如下:

 

 

原创粉丝点击