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

字符编码研究

2013年12月01日 ⁄ 综合 ⁄ 共 5846字 ⁄ 字号 评论关闭

字符编码研究

一.           为什么需要编码

在屏幕上的字是由一个一个的像素点组成的,每一个字符用一组像素点拼接出来,这些像素点组成一副图像,变成了我们的文字。那么是否在计算机中是否就是以图像的形式保存在计算机中呢?那么在我们语言中常常存在大量的重复符号,在计算机中保存的话,每个字符的图像就会有大量的重复,所以,实际上不会保存字符的图像。

实际上,在计算机中,是由大量的01数字来表示现实中的字符数据的。

而为了有效的表示数据,显然光靠01是不能表示自然界中各式各样的语言的,那么就使用一个数字编码来表示一个字符,通过对每一个字符规定一个唯一的数字代号,然后对应每一个代号,建立其对应的图形,这样在每一个文件中,我们只需要保存每一个字符的编码就相当于保存了文字。当需要显示出来的时候,根据对应的代号,查找编码表,就得到了我们所看到的文字。

二.           字符编码基本概念

字符人们使用的记号,抽象意义上的一个符号,如'', 'a', '$'

字节: 计算机中存储数据的单元,一个8位的二进制数,是一个很具体的存储空间

      字符串:由零个或多个字符组成的有限序列。

ANSI字符串: 在计算机中,如果字符是以 ANSI 编码形式存在的,一个字符可能使用一个字节或多个字节来表示,那么我们称这种字符串为 ANS字符串或者多字节字符串, 由于不同 ANSI 编码所规定的标准是不相同的,因此,对于一个给定的字节字符串,我们必须知道它采用的是哪一种编码规则,才能够知道它包含了哪字符

UNICODE字符串: 在计算机中,如果字符是以在 UNICODE 中的序号存在的,那么我们称这种字符串为 UNICODE 字符串或者宽字节字符串, 对于 UNICODE 字符串来说,不管在什么环境下,它所代表的字符内容总是不变的

字符集:在一个字符编码标准中,收入的所有汉字,字母和符号

编码:在一个字符编码标准中所规定的每个“字符”分别使用一个字节还是多个字节存储,用哪些字节来存储。字符集和编码都是在一个标准制定的时候同时产生的

汉字编码,就是采用一种科学可行的办法,为每个汉字编一个唯一的代码,以便计算机辨认、接收和处理

字符编码:就是以二进制的数字来对应字符集的字符,主要是为了处理文本是如何表示字符,各种字符编码之间的区别主要是看它处理语言字符的能力

代码页:ANSI标准中,每个人都认同如何使用低端的128个编码,这与ASCII相当一致。不过,根据所在国籍的不同,处理编码128以上的字符有许多不同的方式。这些不同的系统称为代码页,简而言之,代码页就是针对一种语言文字的字符编码,例如GBKcode pageCP936BIG5code pageCP950GB2312code pageCP20936Windows的内码是Unicode,它在技术上可以同时支持多个代码页。只要文件能说明自己使用什么编码,用户又安装了对应的代码页,Windows就能正确显示。

汉字内码:就是汉字在计算机内部存储,处理和传输所采用的信息编码。它必须与ASCII码兼容但又不能冲突,所以把国标码两个字节的最高位置“1”,以区别于西文,所以内码是指操作系统内部的字符编码,早起的操作系统内码是与语言相关的,但是现在的windows在内部统一使用unicode,然后用代码页适用各种语言,所以现在内码的概念就比较模糊了,更一般的现在内码的概念是指缺省的代码页。

汉字外码:我们输入汉字时所使用的编码,常见的外码分为数字编码(如区位码),拼音编码和自字形编码(如五笔)

区位码:为了使每一个汉字有一个全国统一的代码,1980年,我国颁布了第一个汉字编码的国家标准: GB2312-80《信息交换用汉字编码字符集》基本集,这个字符集是我国中文信息处理技术的发展基础,也是目前国内所有汉字系统的统一标准。由于国标码是四位十六进制,为了便于交流,大家常用的是四位十进制的区位码。所有的国标汉字与符号组成一个94×94的矩阵。在此方阵中,每一行称为一个"",每一列称为一个"",因此,这个方阵实际上组成了一个有94个区(区号分别为0 194)、每个区内有94个位(位号分别为0194)的汉字字符集。一个汉字所在的区号和位号简单地组合在一起就构成了该汉字的"区位码"在汉字的区位码中,高两位为区号,低两位为位号。

 

三.字符编码的发展

 

系统内码

说明

系统

阶段一

ASCII

计算机刚开始只支持英语,其它语言不能够在计算机上存储和显示。

英文 DOS

阶段二

ANSI编码
(本地化)

不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。

不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。

中文 DOS

中文 Windows 95/98

日文 Windows 95/98

阶段三

UNICODE
(国际化)

为了使国际间信息交流更加方便,国际组织制定了 UNICODE 字符集,为各种语言中的每一个字符设定了统一并且唯一的数字编号,以满足跨语言、跨平台进行文本转换、处理的要求。

Windows NT/2000/XPLinux

 

四.           常用字符编码分类及其特点

<>  主要编码分类

单字节字符编码ISO-8859-1(ASCII)

ANSI编码GB2312(1981)BIG5JISGBK1.0(1995年,是双字节符集)GBK180302000年,单字节,双字节和四字节混合方案) ……

UNICODE编码:UTF-8,UTF-16……

ASCIIGB2312 GBKGB18030,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符

GBK加入了几乎所有Big5中的繁体汉字,但是和Big5中的几乎不兼容

Unicode只与ASCII兼容,与GB码不兼容

GB18030前面兼容GBK,其他码位兼容UTF-8

 

所以以上编码的包含方式为:

     GB2312ASCII+常用汉字+符号

     GBKGB2312+不常用字(含BIG5繁体汉字)+图形符号

     GB18030GBK(CJK)Ext-A主要少数民族文字+图形符号

     UnicodeGB18030Ext-B+……(如未发布的Ext-C及其它国家文字)

*CJK:“统一汉字”USC中汉字部分

 

<>  ASCII编码

美国标准信息交换代码( American Standard Code for Information Interchange, ASCII )是由美国国家标准学会(American National Standard Institute , ANSI )制定的,标准的单字节字符编码方案,用于基于文本的数据。起始于50年代后期,在1967年定案。它最初是美国国家标准,供不同计算机在相互通信时用作共同遵守的西文字符编码标准,后被ISOCCITT等国际组织采用ASCII码作为数据传输的标准码,分成标准ASCIIASCII扩展编码方式。

标准ASCII8位来组成:7个位来表示英文大小写字母,数字,标点符号以及美式英语中使用的特殊控制字符,编码范围是0x00-0x7F,其中0x00-0x200x7F33个控制字符,而b7位是奇偶校验位

 ASCII扩展编码方式:8位二进制组合表示256个字符,第8位用于确定附加的128个特殊符号字符,外来语字母和图形符号,目前许多给与x86的系统都支持使用扩展的ASCII

<>  GB2312编码

GB2312GB2312-80是一个简体中文字符集的中国国家标准,全称为《信息交换用汉字编码字符集·基本集》,由中国国家标准总局发布,198151日实施。GB2312编码通行于大陆;新加坡等地也采用此编码。几乎所有的中文系统和国际化的软件都支持GB2312

GB2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时,GB2312收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄罗斯语西里尔字母在内的682个全形字符。

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

GB2312是基于区位码设计的,区位码把编码表分为94个区,每个区对应94个位,每个字符的区号和位号组合起来就是该汉字的区位码。区位码一般   10进制数来表示,如1601就表示161位,对应的字符是。在区位码的区号和位号上分别加上0xA0就得到了GB2312编码。
   
区位码中01-09区是符号、数字区,16-87区是汉字区,10-1588-94是未定义的空白区。它将收录的汉字分成两级:第一级是常用汉字计3755个,置于16-55区,按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字计3008个,置于56-87区,按部首/笔画顺序排列。一级汉字是按照拼音排序的,这个就可以得到某个拼音在一级汉字区位中的范围,很多根据汉字可以得到拼音的程序就是根据这个原理编写的。
    GB2312
的编码范围是0xA1A1-0x7E7E,去掉未定义的区域之后可以理解为实际编码范围是0xA1A1-0xF7FE

 

<>  BIG5编码

大五码(Big5)”是在1984年由台湾财团法人资讯工业策进会和五家有意愿共同推动电脑中文化的资讯公司所共同创立,故称大五码。五家公司为:宏碁、神通、佳佳、零壹及大众
Big5
常用于台湾、香港和澳门等使用繁体中文的地区。

Big-5是一个双字节编码方案,其第一字节的值在16进制的A0FE之间,第二字节在407EA1FE之间。因此,其第一字节的最高位是1,第二字节的最高位则可能是1,也可能是0  

它包含了 420 个图形符号和 13070 个汉字(不包含简化汉字)。编码范围是 0x8140-0xFE7E0x81A1-0xFEFE,其中 0xA140-0xA17E0xA1A1-0xA1FE 是图形符号区,0xA440-0xF97E0xA4A1-0xF9FE 是汉字区

 

<>  GBK编码

GBK: 汉字国标扩展码,基本上采用了原来GB2312-80所有的汉字及码位,并涵盖了原Unicode中所有的汉字20902,总共收录了883个符号,21003个汉字及提供了1894个造字码位。Microsoft简体版中文Windows 95就是以GBK为内码。GBK并不是国家标准,而只是规范,随着GB18030-2000国标的发布,她将在不久的将来完成其历史使命。

 

<>  GB18030

GB18030标准是中国政府于20003月颁布的最新中文汉字编码标准。共收汉字27000余字,还包含蒙文、藏文、维文、彝文四种民族文。北大方正参与制定此国家标准,并提供符合国家标准的四种民族文TrueType字库和相应点阵字库。GB18030编码空间约为160万码位,目前已编码的字符约2.6万。随着我国汉字整理和编码研究工作的不断深入,以及国际标准ISO/IEC 10646的不断发展,GB18030所收录的字符将在新版本中增加

      GB18030-2000标准采用单字节、双字节和四字节三种方式对字符编码。单字节部分采用GB 11383的编码结构与规则,使用 0x000x80码位。双字节部分采用两个字节表示一个字符,其首字节码位从 0x810xFE,尾字节码位分别是0x400x7E0x800xFE。四字节部分第一、三字节仍为0x81~0xFE,第二、四字节采用GB 11383未使用的0x300x39作为对双字节编码扩充的后缀,这样扩充的四字节编码,其范围为0x81308130 0xFE39FE39码位范围分配如下表所示:

1) 单字节部分
单字节部分收录了GB113830x000x7E全部 128个字符及单字节编码的欧元符号。
2)
双字节部分
双字节部分收录的内容如下:
GB13000.1
的全部CJK统一汉字字符;
GB13000.1
CJK兼容区挑选出来的21个汉字;
GB13000.1
中收录而GB2312未收录的我国台湾地区使用的图形字符139个;
GB13000.1
收录的其它字符31个;
GB2312
中的非汉字符号;
GB12345
的竖排标点符号19个;
Gb2312
未收录的10个小写罗马数字;
Gb2312
未收录的带音调的汉语拼音字母5个以及 ag
汉字数字
表意文字描述符13个;
增补汉字和部首/构件80个;
双字节编码的欧元符号。
3)
四字节部分
四字节部分收录了上述双字节字符之外的,包括 CJK 统一汉字扩充 A 在内的 GB13000.1 中的全部字符。

 

<>  UNICODE相关

1. Unicode编码

Unicode又叫万国码,它是为每一种语言中的每一个字符设定统一并且唯一的二进制编码,以满足跨语言,跨平台进行文本转换,处理的要求而形成的一套字符编码规范。Unicode编码系统包括编码方式和实现方式两个层次。其中Unicode编码方式有两套标准,一套叫做UCS-2(Unicode-16),用2个字节为字符编码,最多可以表示65536个字符,现在尚未填充满;另一套叫UCS-4(Unicode-32),用4个字节为字符编码,可以表示2147483648个字符,完全可以覆盖一切语言所用的符号。现在常用的是UCS-2

       Unicode = Universal Multiple-Octet Coded Character Set

       Unicode是兼容ASCII编码的,而GBK等中文编码是不和Unicode兼容的。

例如:“汉”字的Unicode编码是6C57,而GB码是BAB9

 

2. UTF-8

Unicode的实现方式不同于编码方式,一个字符的unicode编码是确定的,但是在实际传输过程中,由于不同系统平台的涉及不一定一致,以及出于节省空间的目的,对Unicode编码的实现方式有所不同,Unicode的实现方式成为UTF。例如字的UCS编码是6C49,我可以用4ASCII数字来传输、保存这个编码;也可以用UTF-8编码:3个连续的

抱歉!评论已关闭.