字符编码简史

  • 很久以前,计算机只能处理英文。那时候一个字符就是一个字节,广泛采用的编码是ASCII。ASCII使用一个字节表示一个英文、数字或常用标点符号,其中字节高位为0,故共有128个字符。
  • 后来,西方各非英语国家/地区为了处理俄语字母、希腊字母等,扩展了ASCII编码,方案是仍然使用一个字节表示一个字符,但是字节高位为1,以便与ASCII区分。从128 到255这一页的字符集被称“扩展字符集”。
  • 1980年,我国公布了GB2312-1980这个国家标准,包含6763个汉字,其中一级汉字(常用字)3755个,二级汉字(次常用字)3008个;同时,GB2312收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。对于人名、古汉语等方面出现的罕用字,GB 2312不能处理。为了与ASCII相区别,GB2312采用双字节方案,一个字符两个字节,每个字节的高位均为1。当然这样是与“扩展字符集”冲突的。
  • 在亚洲很多国家的语言中,广泛使用着大量的汉字,如日文、韩文等,我国港澳台地区使用繁体汉字,所以各国和地区都制定了自己的字符标准,方案一般也是采用双字节表示一个字符,且两个字节的高位至少有一个是1,以便与ASCII区分。不幸的是,这些字符编码,包括我国的GB2312-1980,彼此是冲突的,同一个编码在不同的字符集中代表不同的字符。
  • 为了解决冲突,1991年开始,国际标准化组织(ISO)和一个叫Unicode的组织联合制定新的“通用字符集”。 通用字符集(Universal Character Set, UCS)是由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所定义的标准字符集。UCS-2用两个字节编码,理论上能存储6万多个字符(2^16个),UCS-4用4个字节编码,理论上能存储21亿多个字符(2^31个,因为高位bit要求为0)。UCS-4与UCS-2是兼容的,即UCS-4中高位2个字节为0的部分,省略掉高2字节,即为UCS-2。我国在1993年制定国家标准GB13000.1-1993与UCS-2兼容,现已被GB/T 13000-2010取代。
  • UCS/Unicode是“通用字符集”,但是各国人民都不愿意直接使用它。原因是:
    1. UCS-4太长了,四个字节,且大部分常用字符的高2字节都是0,直接使用就大量浪费空间存一堆0。
    2. 常用字符主要集中在UCS-2能表达的范围中(即UCS-4中高2字节为0的部分,这部分又叫做基本多文本平面,BMP),所以很多情况下大家只使用UCS-2。可是UCS-2并不够用,现在已经整理进入Unicode的汉字有七万多个了,UCS-2只有6万多的字符空间。
    3. 西方国家的人不爱用UCS-2。本来一个英文字符只需要一个字节,现在UCS-2中一个英文字符也要两个字节,高字节为0,那么一篇英文文章的大小就扩大了一倍,且扩大出来的全是0。
    4. 东亚地区的国家和地区的人民也不爱用UCS-2,因为虽然在UCS-2中,一个汉字仍然是2个字节,但是与本国的标准不一致啊,例如在我国,在UCS-2中和在GB2312-1980中,同一个汉字有不同的编码,同一个编码对应不同的汉字。

现在情况就很尴尬了,通用字符集出来了,但是由于效率和兼容的考虑,大家都不愿意直接用字符集中字符的编号。所以对UCS编码要进行转换,大家才能接受使用。现在我们就要区分开两个概念了,一个是字符集(character set),另一个是字符编码(encoding)。字符集就是我们能表达的字符的集合,而字符编码是如何把字符集中的字符进行编码。UCS/Unicode就是大家共同使用的字符集,但是对同一个字符集,可以给出不同的字符编码方案。以下是我们现在广泛使用的几种字符编码:

  • GB18030-2005。这是我国目前使用的强制国家标准,是对UCS/Unicode的一种字符编码方案。它的特点的是采用单、双和四字节的变长编码方案,单字节兼容ASCII码,双字节兼容GB2312-1980和GBK中汉字编码,而四字节部分处理罕用汉字和部分少数民族文字。
  • UTF-16。它采用双字节/四字节编码方案,Unicode中的BMP字符直接对应双字节部分,而超出BMP的字符则采用代理对的方式,用四字节表示一个字符。在计算机底层系统中,很多采用UTF-16字符编码方案的,如Java虚拟机中和Windows内核中(Windows 2000以后)。
  • UTF-8。这是互联网中使用最广泛的字符编码方案,也是事实标准。它采用1-4字节的变长编码方案。英文采用单字节编码,与ASCII兼容,西欧其他语言的字符一般采用2字节编码,常用汉字采用3字节方案编码,罕用字符采用4字节编码。UTF-8的优点:
    1. 对ASCII极佳的兼容性,英文仍然是单字节;
    2. 没有字节序和讨厌的BOM问题;
    3. 可以编码自纠错;
      UTF-8对中文使用者来讲的缺点,是常用汉字采用3字节编码,与GB18030-2005中常用汉字采用2字节编码相比,常用汉字的占的空间扩大了50%。
  • UTF-32。就是UCS-4。

字符集与字符编码的关系,打个比方,比如一个学校有10万学生,这10万学生就是字符集,那么怎么能唯一的找到一个学生呢?有很多种编码方案,比如,用身份证号可以定位一个学生,也可以用全校唯一的学号,也可以用班号+班内小号。所以现在汉字字符集和字符编码的关系,就是这个关系,一个字符集(Unicode),多种编码方案(GB18030-2005,UTF-16,UTF-8,UTF-32等等)

此条目发表在计算机技术分类目录,贴了, , , , , , 标签。将固定链接加入收藏夹。