Unicode 编码 学习笔记(1)——从ASC||到GB2312

一直以来都被ascII,unicode,utf-8,gbk,gb2312,iso-8859-1等等各种和编码相关的概念困扰,另外程序中经常会出现各种因为编码导致的乱码问题,所以今天决定彻底搞懂这些概念之间的联系和区别,总结成若干笔记。

 

首先来看一个叫“字符集”的概念(这个是自己根据网上的资料定义的,不一定准确)。我们知道计算机中的一切数据,不管是文本、数字、图像、视频还是其他神马的,说到底就是很多的二进制数,于是这个数字能表达的信息就丰富了,具体到文本来说,给一个16进制数0x64cf,我可以说它代表字母‘A’,也可以说它代表汉字“字”,关键在于怎么规定二进制数和字符之间的对应关系,而这个对应关系组成的集合就是所谓的“字符集”。

 

“字符集”的概念也可以理解成编码方式,即定义用多少位的二进制数据去对应多少个字符的映射方式,例如可以用1个字节(8bit)的0x61表示‘a’,也可以用2个字节(16bit)的0x0061表示’a’。

 

我们都知道电脑是米国人发明的,米国人使用的英语只需要编码26个字母,加上标点,控制字符乱七八糟的,也就100来个,于是8个bit正好就够编码这些东西了,所以米国人就制定了一套编码方式,将8bit二进制数和英语字符之间建立对应关系,这就是我们知道的鼎鼎有名额ASC||编码,ASC编码一共编码了128个字符(包括32个不能打印的),只占用8bit的后7位,第一位统一规定为0(无符号整数啊,这样就能参与到整数运算中去了,有木有这种考虑!?有木有?!)。

 

但是世界上不只有英语这一种语言,美帝显然没有考虑其他国家人民使用电脑的需求,法语,俄语这些字母语言还可以通过扩展ACSII(128-255部分)来弄,对于东亚的中日韩这三个使用象形文字的国家来说,可就真的伤不起了。汉字多达10万,256个数远远不够用了,这还不算什么简体中文繁体中文,所以一个新的字符集标准出来了,就是著名的GB2312,下面这段是从wikipedia上摘录的对于它的介绍

 

1、GB 2312GB 2312-80中国国家标准简体中文字符集,全称《信息交换用汉字编码字符集·*本集》,又称GB0,由中国国家标准总局发布,1981年5月1日实施。GB2312编码通行于中国大陆;新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持GB 2312。

2、GB 2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时收录了包括拉丁字母希腊字母日文平假名片假名字母、俄语西里尔字母在内的682个字符。GB 2312的出现,*本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖中国大陆99.75%的使用频率。

3、对于人名古汉语等方面出现的罕用字,GB 2312不能处理,这导致了后来GBKGB 18030汉字字符集的出现。

4、在使用GB2312的程序通常采用EUC储存方法,以便兼容于ASCII浏览器编码表上的“GB2312”,通常都是指“EUC-CN”表示法。

每个汉字及符号以两个字节来表示。第一个字节称为“高位字节”,第二个字节称为“低位字节”。

“高位字节”使用了0xA1-0xF7(把01-87区的区号加上0xA0),“低位字节”使用了0xA1-0xFE(把01-94加上 0xA0)。 由于一级汉字从16区起始,汉字区的“高位字节”的范围是0xB0-0xF7,“低位字节”的范围是0xA1-0xFE,占用的码位是 72*94=6768。其中有5个空位是D7FA-D7FE。

例如“啊”字在大多数程序中,会以两个字节,0xB0(第一个字节)0xA1(第二个字节)储存。(与区位码对比:0xB0=0xA0+16,0xA1=0xA0+1)

 

注意到GB2312是兼容ASCII码的,也就是说ASC中的0x61(a)在GB2312中编码相同,但是GB2312明明是2字节编码的啊,难道是00 61?我做了下试验,结果证明GB2312中的'a’就是0x61,之所以可以这样做,是因为汉字和符号使用的编码的首地址是从0xA1开始的,那么0xA1前面的数(0-161)就可以用作ASC编码,这里还有一点需要说明,就是GB2312中也有自己的英文字符编码,比如'a’编码是0xA3E1,写出来是酱紫:a。

 

上文也说了,GB2312只收录了6763个汉字,*本满足了汉字的计算机处理需要,但是有些汉字,比如“啰”是标准发布后才出现的,另外一些常用字,比如“***”的“*”也没有收录,所以一种新的字符集——GBK就出现了。

posted on 2011-06-10 17:22  超级福满多  阅读(521)  评论(0编辑  收藏  举报