现在的位置: 首页 > 综合 > 正文

字符代码体系基础知识

2013年09月02日 ⁄ 综合 ⁄ 共 4269字 ⁄ 字号 评论关闭

    最近在学习《中文自然语言处理》,对其中字符集、代码体系有了更多的了解,区分了之前一些模糊的概念,下面的大部分是我自己敲进去的,顺带说一下,还是维基百科可靠性最高。。

    先小学术一下~

字符代码体系可分为以下四种:
    -交换码:交换目的,用于多台计算机之间的通信,例如ASCII中最后一个I就是交换(Interchange)的缩写。
    -机内码:计算机实际上存储与运算的代码,又称为内码,大多是根据交换码稍加修改而来的,平时说的ASCII、GB2312、Big5主要内码。
    -输入码:字符输入目的、例如拼音、五笔等输入法。
    -字型码:字模数据、即字体库,通过内码计算偏移量能让系统找到需要显示的字体,早期的ASCII的字模文件很小,都是直接做在BIOS上的。而现在的字体,一般都是做成TTF文件放在外部存储器上。

    下面对平时常见的的名词进行解释:ASCII、GB2312-80、GB18030、GBK、BIG5、UCS、Unicode、UTF-8、UTF-16、Base64,我之前对UCS、Unicode和UTF-8就不是特别清楚。。

ASCII
    ASCII码,是美国信息交换标准码(American Standard Code for Information Interchange)的缩写,也是最早最经典的字符代码体系,它既是交换码又是机内码,并且与键盘键敲击的脉冲信号也是先对应的,通过计算ASCII码的实际二进制值可以得到字体在字模库中的偏移量。ASCII码使用一个字节来表示英文字母、数字和符号、高八位始终为0,主要用途是校验位或者是标志位。剩下的七位,则可以表示27=128个字符、这对于英文字符时绰绰有余的:32个控制字符(回车、退格、换行、响铃等)和94个可显示字符(字母、数字、符号)。通过下图ASCII码的代码空间可以看出,设计的很合理,C0区时控制字符区、GL区是可显示字符区:

ASCII-1

GB2312-80
    GB2312-80是信息交换用汉字编码字符集----基本集的缩写,80代表的是1980年发布的。用于汉字的数量众多,光常用字就好几千个,一个字节肯定是不能够表示这么多字符的,所以GB2312使用了两个字节来表示一个字符,这样一来,可以表示216=65536个字符,是足够用的。由于历史原因(~_~),英文字符是必须要用到的,所以GB2312参考了ASCII码的设计方式,两个字节中都应用了ASCII码的代码空间,如下图,C0区、GL区、C1区、GR区;但是如何与ASCII码区分开来呢?普遍采取的做法是:将第一字节的高八位置1,则连续的两个字节表示一个汉字,若高八位是0则是一个ASCII码字符。在GB2312中,第一个字节称为,第二个字节称为,区位码就是这么来的,总共有94个区和位。其中前1区~9区表示符号数字西文字符、10区~15区和88区~94区都是空的(计算显示字体所需要的偏移量用的)、16区~55区是最常用的汉字,即一级汉字(3755个)、56区~87区是次常用的,即二级汉字(3008个 )。

GBK
   GB2312 仅收汉字 6763 个,这大大少于现有汉字,随着时间推移及汉字文化的不断延伸推广,有些原来很少用的字,现在变成了常用字,例如:朱镕基的“镕”字,未收入 GB2312-80,现在大陆的报业出刊只得使用(金+容)、(金容)、(左金右容)等来表示,形式不一而同,这使得表示、存储、输入、处理都非常不方便,而且这种表示没有统一标准。为了解决这些问题,以及配合 UNICODE 的实施,全国信息技术化技术委员会于1995年12月1日《汉字内码扩展规范》。GBK 向下与 GB2312 完全兼容,向上支持 ISO 10646 国际标准,在前者向后者过渡过程中起到的承上启下的作用。

GB18030 
    GB18030 是最新的汉字编码字符集国家标准, 向下兼容 GBK 和 GB2312 标准。 GB18030 编码是一二四字节变长编码。一字节部分从 0x0~0x7F 与 ASCII 编码兼容。 二字节部分, 首字节从 0x81~0xFE, 尾字节从 0x40~0x7E 以及 0x80~0xFE, 与 GBK 标准基本兼容。 四字节部分, 第一字节从 0x81~0xFE, 第二字节从 0x30~0x39, 第三和第四字节的范围和前两个字节分别相同。 四字节部分覆盖了从 0x0080 开始, 除去二字节部分已经覆盖的所有 Unicode 3.1 码位。也就是说, GB18030 编码在码位空间上做到了与 Unicode 标准一一对应,这一点与 UTF-8 编码类似。

BIG5
    Big5码是台湾地区对繁体汉字的编码体系,它也参考了ASCII码的设计,不过有所改变。第一个字节分为C0区和GL区、第二个字节则不区分,全部用来编码,则可以表示94*128个繁体字。而实际上Big5码收录大概1万个繁体字,其中包括了很多不常用的汉字。十年前流行的内码转换工具:南极星、金山内码工具等等,都是当时游戏玩家的必备工具~

UCS
    UCS是Universal multiple--Octet Coded Character Set的英文缩写(有时也简称为Universal Character Set),是ISO从1984年发起的国际标准,试图囊括所有的人类自然语言,所以UCS采取了四字节编码的方式,并与1999年发布了UCS第一版,即ISO 10646-1。为什么经历了十五年才制定出一个标准呢?后面会提到,因为国际标准和行业事实标准还是会有冲突的(ISO的OSI模型和TCP/IP模型就是典型例子),正是因为各大IT公司不断的否决才导致,UCS的发布一拖再拖。UCS四个字节中,分为组八位(G-Ocbet)、面八位(P-Ocbet)、行八位(R-Ocbet)、位八位(C-Ocbet)。组八位中的高八位也是为0,设计初衷和ASCII码一样----校验位。共有128组、256面、256行、256位,所能表示的字符数是个可怕的数字。。但实际上呢,只有0、1、2字面上收录了字符,其他都是空的。所以才导致了Unicode的出现,请看UCS的代码空间,“浪费严重”

image003

Unicode
    Unicode是Xerox和Apple也在1984年成立的工作组,开始Unicode原始设计;1989年发布了Unicode草案第一版;到1991年,IBM、DEC、SUN、Xerox、Apple、Microsoft、Novell成立Unicode协会,并不断与ISO沟通协调,与1996年推出的Unicode2.0完全与UCS兼容,即在UCS的0组0面就是Unicode的编码。而Unicode与UCS的转换很简单,Unicode每个字符前面加上两个全0的字节即为UCS字符、UCS字符去掉前面两个为0的字节即为Unicode字符。Unicode的设计也是相当经典:
    -定长16位编码,使得计算机处理起来很容易,毕竟一次性处理2两个字节在当时比4个字节要容易的多
    -采取全编码方式(6万个字符足以),不区分C0、GL区,并迫使UCS也接受了这种方式
    -完备编码,容纳已有的标准字符,GB2312、BIG5、ASCII中的字符都能在Unicode中找到
    -纯字符编码,不区分语言、国别
    -统一了中、日、韩的汉字字符
Windows系统在Vista以后,系统内核中已经采用了Unicode编码方式。现在Unicode版本已经到4.0了,我们通常所说的 Unicode,实际上是指某一种 UTF,比如:Windows 记事本中为 UTF-16,IE 浏览器中为 UTF-8。

Base64
    因为历史原因,计算机网络协议只能传输ASCII码、所以汉字是不能直接传输的,需要进一步编码。最常见的就是浏览器地址栏URL中的一串表示,如http://[2001:4860:8005::84]/search?q=cache:p2nZf9S7OpIJ:icolumn.net/%3Fp%3D1830+%E5%86%8D%E8%B0%88Google%E4%BA%8B%E4%BB%B6&cd=2&hl=en&ct=clnk,其中%中的那些数据实际上是经过再次编码得到的数据,常见的UUEncode、Base64、UTF等就是为了在网络上传输而产生的编码方案。Base64,是这样实现的:将3个8位转换为4个6位(Base64名字的由来),每个6位前面补两个0,最后变成4个字节,每个字节的值都是0~63在之前,若是直接传输,而ASCII码中的控制字符可能会与网络协议中的控制字符作用相冲突,所以Base64进行了再次编码,0~25-大写字母、26~51-小写字母、52~61-阿拉伯数字、62-+、63-/。将这些可视字符通过网络发送过去,接收方再逆向解码得到原始数据。

UTF-8、UTF-16
    UTF-8(8 位Universal Character Set/Unicode Transformation Format)是一种针对Unicode的可变长度字符编码(定长码),也是一种前缀码。它可以用来表示Unicode标准中的任何字符,且其编码中的第一个字节仍与ASCII兼容,这使得原来处理ASCII字符的软件无须或只须做少部份修改,即可继续使用。因此,它逐渐成为电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。 UTF-8使用一至四个字节为每个字符编码: 128个US-ASCII字符只需一个字节编码(Unicode范围由U+0000至U+007F)。带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及它拿字母则需要二个字节编码(Unicode范围由U+0080至U+07FF)。其他基本多文种平面(BMP)中的字符(这包含了大部分常用字)使用三个字节编码。其他极少使用的Unicode 辅助平面的字符使用四字节编码。 对上述提及的第四种字符而言,UTF-8使用四个字节来编码似乎太耗费资源了。但UTF-8对所有常用的字符都可以用三个字节表示,而且它的另一种选择,UTF-16编码,对前述的第四种字符同样需要四个字节来编码,所以要决定UTF-8或UTF-16哪种编码比较有效率,还要视所使用的字符的分布范围而定。不过,如果使用一些传统的压缩系统,比如DEFLATE,则这些不同编码系统间的的差异就变得微不足道了。互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。

抱歉!评论已关闭.