字符集学习笔记(一)
?
摘自http://bbs.9ria.com/viewthread.php?tid=19624
我们国家先后搞过三套汉字编码标准,既GB2312、GBK和GB18030。
?
一、GB2312
GB2312又称为GB2312-80字符集,全称为《信息交换用汉字编码字符集·基本集》,由原中国国家标准总局发布,1981年5月1日实施。共7445个图形字符,其中包括6763个汉字,一级汉字3755个,二级汉字3008个。它所收录的汉字已经覆盖99.75%的使用频率,基本满足了汉字的计算机处理需要。
区位:GB2312中对所收汉字进行了“分区”处理,每区含有94个汉字/符号。这种表示方式也称为区位码。各区包含的字符如下:01-09区为特殊符号;16-55区为一级汉字,按拼音排序;56-87区为二级汉字,按部首/笔画排序;10-15区及88-94区则未有编码。
双字节表示:两个字节中前面的字节为第一字节,后面的字节为第二字节。习惯上称第一字节为“高字节”,而称第二字节为“低字节”。“高位字节”使用了0xA1-0xF7(把01-87区的区号加上0xA0),“低位字节”使用了0xA1-0xFE(把01-94加上0xA0)。以GB2312字符集的第一个汉字“啊”字为例,它的区号16,位号01,则区位码是1601,在大多数计算机程序中,高字节和低字节分别加0xA0得到程序的汉字处理编码0xB0A1。计算公式是:0xB0=0xA0+16, 0xA1=0xA0+1。
?
二、BIG5
又称大五码或五大码,1984年由台湾财团法人信息工业策进会和五间软件公司宏碁 (Acer)、神通 (MiTAC)、佳佳、零壹 (Zero One)、大众 (FIC)创立,故称大五码。Big5码的产生,是因为当时台湾不同厂商各自推出不同的编码,如倚天码、IBM PS55、王安码等,彼此不能兼容;另一方面,台湾政府当时尚未推出官方的汉字编码,而中国大陆的GB2312编码亦未有收录繁体中文字。Big5字符集共收录13,053个中文字,该字符集在中国台湾使用。
Big5码使用了双字节储存方法,以两个字节来编码一个字。第一个字节称为“高位字节”,第二个字节称为“低位字节”。高位字节的编码范围0xA1-0xF9,低位字节的编码范围0x40-0x7E及0xA1-0xFE。?
?
三、GBK
随着计算机应用的普及,一些偏僻的人名、地名及古籍用字遇到了麻烦,例如“镕”就不在GB2312标准中。在这种情况下,我国的信息标准化委员会就对原标准进行了扩充。他们把常用繁体字(实际上就来源于台湾的BIG5标准)填充到了原来的编码标准中留下空白码段,使汉字个数扩到2万多个。GBK虽然部分解决了使用繁体字的问题,带来的副作用却很大。因为在GB2312中留下的空白码段有两个用途,大部分是为了避免和西方单字节编码标准的冲突,还有就是留给用户造字用的。而GBK却占用了这些本不该使用的空白,例如冲掉用户自造字、显示混乱等。而且对于以往的大量应用软件来说,如果他们没有专门为GBK编码标准进行改造,往往就会出错。但是还算好,尽管大家对GBK的抱怨很多,慢慢地很多国际公司和国际标准组织也都勉强接受了GBK标准,把它用来替换GB2312。作为制定GBK的我国政府来说,我想这里可能还有另外一个目的,那就是因为GBK是包括GB2312和BIG5(繁体字标准)的一个超集,所以希望东亚使用汉字的地区都能采用这个标准,但这个目的在今天来看并没有达到,BIG5编码标准和我们的GB2312一样仍然在港澳台及海外被广泛使用。
GBK是GB2312-80 的扩展,是向上兼容的。它包含了 20902 个汉字,其编码范围是 0x8140-0xfefe,剔除高位 0x80 的字位。
?
四、GB18030
GB 18030的全称是GB18030-2000《信息交换用汉字编码字符集基本集的扩充》,是我国政府于2000年3月17日发布的新的汉字编码国家标准,2001年8月31日后在中国市场上发布的软件必须符合本标准。
GB 18030标准采用单字节、双字节和四字节三种方式对字符编码。单字节部分使用0×00至0×7F码(对应于ASCII码的相应码)。双字节部分,首字节码从0×81至0×FE,尾字节码位分别是0×40至0×7E和0×80至0×FE。四字节部分采用GB/T 11383未采用的0×30到0×39作为对双字节编码扩充的后缀,这样扩充的四字节编码,其范围为0×81308130到0×FE39FE39。其中第一、三个字节编码码位均为0×81至0×FE,第二、四个字节编码码位均为0×30至0×39。?
既然常用汉字不过3000多个,最多到6000个左右基本已覆盖99%以上的实际需求,为什么还要搞更大规模的编码标准呢?相信前面的几位网友对此都不太理解。这是信息的国际化交流所产生的世界需求,就像当初秦统一文字一样,现在的形势是要统一国际文字编码。比方来说,如果一个台湾朋友给你发一封信,而信的内容是按BIG5编码标准写的,我们要正确显示它就需要了解BIG5编码的细节以及一套字库,反过来也是一样。而对于一个应用程序来说,譬如一个BBS网站,它如果同时接受台湾的网友和大陆的网友一起聊天,如果它不作特别约定,它是不知道用户送进来的文字是什么方式编码的,因此显示的结果就是一片混乱。所以,在早期,一些中文BBS网站在登录或发言的时候要求用户选择所用的编码方式。很显然,这是不方便的,对于信息的存储和传输来说,也需要额外的处理时间和标志,对于程序开发人员来说,各种五花八门的编码方式更是浪费人力、物力。
也就是说是信息的国际化以及信息产品的国际化要求统一文字编码,以保障任何人发给你的信息你都可以理解而不需要对方告诉你他的编码方式。GBK的诞生也基本带有这个目标,它希望能让港澳台和大陆一节海外华人使用同一编码标准;对于GB18030来说,目标就更大了,它希望整个东亚都能使用我们的汉字编码标准。可是,愿望是良好的,现实是残酷的。因为这些的目标的实现要求这些地区的操作系统、应用软件都得支持GBK/GB18030,特别是对方的输入软件和显示字库也得支持才行。很显然,我们没办法让大陆之外的人都听我们的,结果是除了GBK在华人地区有一定推广以外,GB18030就遇到了事实上的抵制。这种抵制除了因为这种编码本身不科学(会增加程序开发的成本也增加软件出错的几率)以外,更重要的原因是,人们已经有了一个更好的选择,那就是“UNICODE”。?
UNICODE的背后支持者是微软公司,而微软在计算机软件行业是处于霸主地位,这是无法否认的。从操作系统、数据库、应用软件到游戏,微软的产品布满全球各个角落,所以他提出的编码标准天然的就具有绝对优势。也就是说,如果某个公司是遵守UNICODE标准开发的软件,就可以保证在全球的Windows(NT)平台上正确运行和显示,包括中国大陆和港澳台、日本;而如果遵守GB18030标准呢,则至多只能保证在我国大陆地区的简体中文版上正确运行。况且,微软虽然迫于中国压力,对于简体中文版操作系统做了支持GB18030的改动,但这种被迫的改动只会是表面的,作为国际公司,他决不可能更改Windows(NT)内核的UNICODE编码方式来适应一个地方不甚科学的需要。因此,从国外到国内,大家会支持谁呢?是我们怪异的GB18030还是被广泛认可的UNICODE?结果是显而易见的,人们会选择优势标准,我们阻挡不了什么。我们的行政手段还没到可以左右世界的地步。
现在还没有任何一个操作系统或软件实现了GBK2K的支持。
五、Unicode
Unicode字符集编码是Universal Multiple-Octet Coded Character Set 通用多八位编码字符集的简称,是由一个名为 Unicode 学术学会(Unicode Consortium)的机构制订的字符编码系统,支持现今世界各种不同语言的书面文本的交换、处理及显示。该编码于1990年开始研发,1994年正式公布,最新版本是2005年3月31日的Unicode 4.1.0。UTF-8是Unicode的其中一个使用方式。 UTF是 Unicode Translation Format,即把Unicode转做某种格式的意思。?
UTF-8便于不同的计算机之间使用网络传输不同语言和编码的文字,使得双字节的Unicode能够在现存的处理单字节的系统上正确传输。?
UTF-8使用可变长度字节来储存 Unicode字符,例如ASCII字母继续使用1字节储存,重音文字、希腊字母或西里尔字母等使用2字节来储存,而常用的汉字就要使用3字节。辅助平面字符则使用4字节。?
UTF-32、UTF-16 和 UTF-8 是 Unicode 标准的编码字符集的字符编码方案,UTF-16 使用一个或两个未分配的 16 位代码单元的序列对 Unicode 代码点进行编码;UTF-32 即将每一个 Unicode 代码点表示为相同值的 32 位整数。
ActionScript3 采用的就是 Unicode 字符集处理字符串(String 类型)类型 进行字符运算。