各种编码的辨析与比较
1.ASCII与Binary
我们日常接触到的文件分ASCII和Binary两种。ASCII是“美国信息交换标准编码”的英文字头缩写,可称之为“美标”。美标规定了用从0到127的128个数字来代表信息的规范编码,其中包括33个控制码,一个空格码,和94个形象码。形象码中包括了英文大小写字母,阿拉伯数字,标点符号等。我们平时阅读的英文电脑文本,就是以形象码的方式传递和存储的。美标是国际上大部分大小电脑的通用编码。
然而电脑中的一个字符大都是用一个八位数的二进制数字表示。这样每一字符便可能有256个不同的数值。由于美标只规定了128个编码,剩下的另外128个数码没有规范,各家用法不一。另外美标中的33个控制码,各厂家用法也不尽一致。这样我们在不同电脑间交换文件的时候,就有必要区分两类不同的文件。第一类文件中每一个字都是美标形象码或空格码。这类文件称为“美标文本文件”(ASCII Text Files),或略为“文本文件”,通常可在不同电脑系统间直接交换。第二类文件,也就是含有控制码或非美标码的文件,通常不能在不同电脑系统间直接交换。这类文件有一个通称,叫“二进制文件”(Binary Files).
2.国标、区位、“准国标”
“国标”是“中华人民共和国国家标准信息交换用汉字编码”的简称。国标表(基本表)把七千余汉字、以及标点符号、外文字母等,排成一个94行、94列的方阵。方阵中每一横行叫一个“区”,每个区有九十四个“位”。一个汉字在方阵中的坐标,称为该字的“区位码”。例如“中”字在方阵中处于第54区第48位,它的区位码就是5448.
其实94这个数字。它是美标中形象码的总数。国标表沿用这个数字,本意大概是要用两个美标形象符代表一个汉字。由于美标形象符的编码是从33到126,汉字区、位码如果各加上32,就会与美标形象码的范围重合。如上例“中”字区、位码加上32后,得86,80。这两个数字的十六进制放在一起得5650,称为该字的“国标码”,而与其相对应的两个美标符号,VP,也就是“中”字的“国标符”了。
这样就产生了一个如何区分国标符与美标符的问题。在一个中英文混用的文件里,“VP”到底代表“中”字呢,还是代表某个英文字头缩写?电子工业部第六研究所开发CCDOS的时候,使用了一个简便的解决方案:把国标码的两个数字各加上128,上升到非美标码的位置。(改变后的国标码,习惯上仍叫“国标”。)
这个方案固然解决了原来的问题,可是新的问题随之产生。中文文件成了“二进制文件”,既不能可靠地在不同电脑系统间交换,也不与市场上大部分以美标符号为设计对象的软件兼容。
为了区分以上两种“国标”,我们把原与美标形象码重合的国标码称为“纯国标” ,而把CCDOS加上128的国标码称为“准国标”。
3.GBK码:
GBK码是GB码的扩展字符编码,对多达2万多的简繁汉字进行了编码,简体版的Win95和Win98都是使用GBK作系统内码。
从实际运用来看,微软自win95简体中文版开始,系统就采用GBK代码,它包括了TrueType宋体、黑体两种GBK字库(北京中易电子公司提供),可以用于显示和打印,并提供了四种GBK汉字的输入法。此外,浏览器IE4.0简体、繁体中文版内部提供了一个GBK-BIG5代码双向转换功能。此外,微软公司为IE提供的语言包中,简体中文支持(Simplified Chinese Language Support Kit)的两种字库宋体、黑体,也是GBK汉字(珠海四通电脑排版系统开发公司提供)。其他一些中文字库生产厂商,也开始提供TrueType或PostScript GBK字库。
许多外挂式的中文平台,如南极星、四通利方(Richwin)等,提供GBK码的支持,包括字库、输入法和GBK与其他中文代码的转化器。
互联网方面,许多网站网页使用GBK代码。
但是多数搜索引擎都不能很好的支持GBK汉字搜索,大陆地区的搜索引擎有些能不完善的支持GBK汉字检索。
其实,GBK是又一个汉字编码标准,全称《汉字内码扩展规范》(Chinese Internatial Code Specification),1995年颁布。GB是国标,K是汉字“扩展”的汉语拼音第一个字母。
GBK向下与GB-2312编码兼容,向上支持ISO 10646.1国际标准,是前者向后者过渡的一个承启标准。
GBK规范收录了ISO 10646.1中的全部CJK汉字和符号,并有所补充。具体包括:GB 2312中的全部汉字、非汉字符号;GB 13000.1中的其他CJK汉字。以上合计20902个GB化汉字;《简化总表中》未收入GB 13000.1的52个汉字;《康熙字典》以及《辞海》中未被收入GB 13000.1的28个部首及重要构件;13个汉字结构符;BIG-5中未被GB 2312收入、但存在于GB 13000.1的139个图形符号;GB 12345增补的6个拼音符号;GB 12345增补的19个竖排图形符号(GB 12345较GB 2312增补竖排标点符号29个,其中10个未被GB 13000.1收入,故GBK亦不收);从GB 13000.1的CJK兼容区挑选出的21个汉字;GB 13000.1收入的31个IBM OS/2专用符号。GBK亦采用双字节表示,总体编码范围为0x8140~0xFEFE之间,首字节在0x81~0xFE之间,尾字节在0x40~0xFE之间,剔除0x××7F一条线,总计23940个码位,共收入21886个汉字和图形符号,其中汉字(包括部首和构件)21003个,图形符号883个。
4.BIG5码:
BIG5码是针对繁体汉字的汉字编码,目前在台湾、香港的电脑系统中得到普遍应用。BIG5码的编码范围参考下文。
5.HZ码:
HZ码是在Internet上广泛使用的一种汉字编码。“HZ”方案的特点,是以“纯国标”的中文与美标码混用。那么“HZ”是怎样区分国标符和美标符的呢?答案其实也很简单:当一串美标码中间插入一段国标码的时候,我们便在国标码的前面加上~,后面加上~。这些附加码分别叫“逃出码”和“逃入码”。 由于这些附加码本身也是美标形象码,整个文件就俨然是一个美标文本文件,可以安然地 在电脑网上传递,也和大部分英文文本处理软件兼容。
6.ISO-2022CJK码:
ISO-2022是国际标准组织(ISO)为各种语言字符制定的编码标准。采用二个字节编码,其中汉语编码称ISO-2022 CN,日语、韩语的编码分别称JP、KR。一般将三者合称CJK码。目前CJK码主要在Internet网络中使用。
7.UCS 和 ISO 10646:
1993年,国际标准ISO10646 定义了通用字符集 (Universal Character Set, UCS)。 UCS 是所有其他字符集标准的一个超集。它保证与其他字符集是双向兼容的。就是说, 如果你将任何文本字符串翻译到 UCS格式, 然后再翻译回原编码, 你不会丢失任何信息。
UCS 包含了用于表达所有已知语言的字符。不仅包括拉丁语,希腊语, 斯拉夫语,希伯来语,阿拉伯语,亚美尼亚语和乔治亚语的描述, 还包括中文, 日文和韩文这样的象形文字, 以及平假名, 片假名, 孟加拉语, 旁遮普语果鲁穆奇字符(Gurmukhi), 泰米尔语, 印.埃纳德语(Kannada), Malayalam, 泰国语, 老挝语, 汉语拼音(Bopomofo), Hangul, Devangari, Gujarati, Oriya, Telugu 以及其它语种。对于还没有加入的语言, 由于正在研究怎样在计算机中最好地编码它们, 因而最终它们都将被加入。这些语言包括Tibetian, 高棉语, Runic(古代北欧文字), 埃塞俄比亚语, 其他象形文字, 以及各种各样的印-欧语系的语言, 还包括挑选出来的艺术语言比如 Tengwar, Cirth 和 克林贡语(Klingon)。UCS 还包括大量的图形的, 印刷用的, 数学用的和科学用的符号, 包括所有由 TeX, Postscript, MS-DOS,MS-Windows, Macintosh, OCR 字体, 以及许多其他字处理和出版系统提供的字符。
ISO 10646 定义了一个 31 位的字符集。 然而, 在这巨大的编码空间中, 迄今为止只分配了前 65534 个码位 (0x0000 到 0xFFFD)。这个UCS的16位子集称为基本多语言面 (Basic Multilingual Plane, BMP)。 将被编码在16位BMP以外的字符都属于非常特殊的字符(比如象形文字), 且只有专家在历史和科学领域里才会用到它们。按当前的计划, 将来也许再也不会有字符被分配到从0x000000到0x10FFFF这个覆盖了超过100万个潜在的未来字符的 21 位的编码空间以外去了。ISO 10646-1标准第一次发表于1993年, 定义了字符集与 BMP 中内容的架构。定义 BMP以外的字符编码的第二部分 ISO 10646-2 正在准备中, 但也许要过好几年才能完成。新的字符仍源源不断地加入到 BMP 中, 但已经存在的字符是稳定的且不会再改变了。
UCS 不仅给每个字符分配一个代码, 而且赋予了一个正式的名字。表示一个 UCS 或 Unicode 值的十六进制数, 通常在前面加上 "U+", 就象U+0041 代表字符"拉丁大写字母A"。UCS字符U+0000到U+007F 与 US-ASCII(ISO 646) 是一致的, U+0000 到 U+00FF 与 ISO 8859-1(Latin-1) 也是一致的。从 U+E000 到 U+F8FF, 已经BMP 以外的大范围的编码是为私用保留的。
1993年,ISO10646中定义的USC-4 (Universal Character Set) ,使用了4 个字节的宽度以容纳足够多的相当可观的空间,但是这个过于肥胖的字符标准在当时乃至现在都有其不现实的一面,就是会过分侵占存储空间并影响信息传输的效率。 与此同时,Unicode 组织于约 10 年前以 Universal, Unique和Uniform 为主旨也开始开发一个16位字符标准, 为避免两种16位编码的竞争,1992年两家组织开始协商,以期折衷寻找共同点,这就是今天的 UCS-2 (BMP,Basic Multilingual Plane,16bit) 和Unicode,但它们仍然是不同的方案。
8.Unicode码:
关于Unicode我们需要追溯一下它产生的源源。
当计算机普及到东亚时,遇到了使用表意字符而非字母语言的中、日、韩等国家。在这些国家使用的语言中常用字符多达几千个,而原来字符采用的是单字节编码,一张代码页中最多容纳的字符只有28=256个,对于使用表意字符的语言是在无能为力。既然一个字节不够,自然人们就采用两个字节,所有出现了使用双字节编码的字符集(DBCS)。不过双字节字符集中虽然表意字符使用了两个字节编码,但其中的ASCII码和日文片假名等仍用单字节表示,如此一来给程序员带来了不小的麻烦,因为每当设计到DBCS字符串的处理时,总是要判断当中的一个字节到底表示的是一个字符还是半个字符,如果是半个字符,那是前一半还是后一半?由此可见DBCS并不是一种非常好的解决方案。
人们在不断寻找这更好的字符编码方案,最后的结果就是Unicode诞生了。Unicode其实就是宽字节字符集,它对每个字符都固定使用两个字节即16位表示,于是当处理字符时,不必担心只处理半个字符。
目前,Unicode在网络、Windows系统和很多大型软件中得到应用。
常用编码方式的转换
虽说有多种编码方式,实际上除ASCII码外,其它区位码、国标码基本上都是一回事,只是其编码的方式不同、对汉字的存取方式不同。机内码是机器语言编码,它包括有语言的解释、各类字符的机器编码等。ASCII码是常用的字符、符号,为1到255,十六进制01到FF。区位码是包括汉字在内的特殊字符集,共分87区,94位,其基数都是从0开始。国标码实际上是区位码的字符集,只是其编码的基数与区位码有所区别,一般用十六进制表示,区数从21到79,位数从21到7e。机内码的字符集编码是区码从a1到f7,位码是从a1到fe。
区位码
|
01
|
01
|
03
|
04
|
05
|
06
|
07
|
08
|
国标码
|
21
|
22
|
23
|
24
|
25
|
26
|
27
|
28
|
机内码
|
A1
|
A2
|
A3
|
A4
|
A5
|
A6
|
A7
|
A8
|
16
|
|
|
|
|
|
|
|
|
30
|
啊
|
阿
|
埃
|
挨
|
哎
|
唉
|
哀
|
皑
|
B0
|
|
|
|
|
|
|
|
|
1.ASCII码:
ASCII码0至32一般为功能控制,48至57为0到9数字,58至90为大写字母,97至122为小写字母,其它为常用符号。
2.区位码:
区位码的1区是常用图案符号,2区是序数标数,3区是与ASCII相近的常用符号,4、5区日文片假名,6区是拉丁文,7区是俄文,8区是汉语拼音,9区是制表符,16区以后是汉字区。10区至15区为空区。
3.国标码:
国标码的推算公式:国标码=区位码+20
4.机内码:
机内码的推算公式:
机内码=区位码+A0
中文编码的编码范围
1.国标(GB)
非汉字
|
第一字节
|
第二字节
|
A1
|
A1~EF
|
A2
|
B1~E2/E5~EE/F1~FC
|
A3
|
A1~FE
|
A4
|
A1~F3
|
A5
|
A1~F6
|
A6
|
A1~B8/C1~D8
|
A7
|
A1~C1/D1~F1
|
A8
|
A1~BA/C5~E9
|
A9
|
A4~EF
|
一级汉字
|
B0~D6
|
A1~FE
|
D7
|
A1~F9
|
二级汉字
|
D8~F7
|
A1~FE
|
2.BIG5
非汉字
|
第一字节
|
第二字节
|
A1~A2
|
40~7E/A1~FE
|
A3
|
40~7E/A1~E0
|
C6
|
A1~FE
|
C7~C8
|
40~7E/A1~FE
|
一级汉字
|
A4~C5
|
40~7E/A1~FE
|
C6
|
40~7E
|
二级汉字
|
C9~F8
|
40~7E/A1~FE
|
81~A0
|
40~7E/A1~D5
|
3.GBK
第一字节
|
第二字节
|
A8~FE
|
40~A0
|
81~A0
|
40~FE
|