字符集与字符编码简介

字符集与字符编码简介 
  
我们知道,计算机只能识别诸如0101这样的二进制数,于是人们必须以二进制数据与计算机进行交互,或者先将人类使用的字符按一定规则转换为二进制数。 
那什么是字符呢?在计算机领域,我们把诸如文字、标点符号、图形符号、数字等统称为字符。 
计算机中的字是如何处理的?  
如果你用放大镜看一下,可以看出屏幕上的字是由一个一个的像素点组成的,每一个字符用一组像素点拼接出来,这些像素点组成一幅图像,变成了我们的文字,计算机又是如何将我们的文字保存起来的呢?是用一个个的点组成的图像将文字保存起来的吗?当然不是,让我们从英文开始,由于英文是拼音文字,实际上所有的英文字符和符号加起来也不超过100个,在我们的文字中存在着如此大量的重复符号,这就意味着保存每个字符的图像会有大量的重复,比如 e 就是出现最多的符号等等。所以在计算机中,实际上不会保存字符的图像。  


什么是字符编码?  
由于我们的文字中存在着大量的重复字符,而计算机天生就是用来处理数字的,为了减少我们需要保存的信息量,我们可以使用一个数字编码来表示每一个字符,通过对每一个字符规定一个唯一的数字代号,然后,对应每一个代号,建立其相对应的图形,这样,在每一个文件中,我们只需要保存每一个字符的编码就相当于保存了文字,在需要显示出来的时候,先取得保存起来的编码,然后通过编码表,我们可以查到字符对应的图形,然后将这个图形显示出来,这样我们就可以看到文字了,这些用来规定每一个字符所使用的代码的表格,就称为编码表。编码就是对我们日常使用字符的一种数字编号。  
而由字符组成的集合则成为字符集,字符集由于包含字符的多少与异同而形成了各种不同的字符集。通俗地讲,编码方式是实现字符集存储与传输的一种实现方式。我们知道,所有字符在计算机中都是以二进制来存储的。那么一个字符究竟由多少个二进制位来表示呢?这就涉及到字符编码的概念了,比如一个字符集有8个字符,那么用3个二进制位就可以完全表示该字符集的所有字符,也即每个字符用3个二进制位进行编码。 
  
我们规定字符编码必须完成如下两件事(即两个原则): (1)    规定一个字符集中的字符由多少个字节表示 
(2)    制定该字符集的字符编码表,即该字符集中每个字符对应的(二进制)值。 

 

1.    ASCII 码: 
 我们首先得知道这是一种编码标准,而这一标准也成为以后其他标准参考的原始标准以及兼容的基础,它的字符集则是英文字符集。 
上个世纪60年代,美国制定了一套字符编码标准,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。 
ASCII(American Standard Code for Information Interchange),是一种字符编码标准,它的字符集为英文字符集,它规定字符集中的每个字符均由一个字节表示,指定了字符表编码表,称为ASCII码表。它已被国际标准化组织定义为国际标准,称为ISO646标准。 
ASCII码一共规定了128个字符的编码,比如空格“SPACE”是32(二进制00100000),大写的字母A是65(二进制01000001)等。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。这种采用一个字节来编码128个字符的ASCII码称为标准 ASCII 码或者基础ASCII码。 
在标准ASCII码表中,0~31及127(共33个)是控制字符或通讯专用字符,如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(振铃)等;通讯专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为 8、9、10 和 13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。     32~126(共95个)是可显示字符,其中32是空格,48~57为0到9十个阿拉伯数字;65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。  
    同时还要注意,在标准ASCII中,其最高位(b7)可用作奇偶校验位。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。 
  
但是,由于标准 ASCII 字符集字符数目有限,在实际应用中往往无法满足要求。为此,国际标准化组织又制定了 ISO 2022 标准,它规定了在保持与 ISO646 兼容的前提下将 ASCII 字符集扩充为 8 位代码的统一方法。 ISO 陆续制定了一批适用于不同地区的扩充 ASCII 字符集,每种扩充 ASCII 字符集分别可以扩充 128 个字符,这些扩充字符的编码均为高位为 1 的 8 位代码(即十进制数 128~255 ),称为扩展 ASCII 码。 

 但是需要注意,各种扩展ASCII码除了编码为0~127的字符外,编码为128~255的字符并不相同。比如,130在法语编码中代表了é,在希伯来语编码中却代表了字母Gimel (ג),在俄语编码中又会代表另一个符号。 2.    ANSI编码标准   
     标准ASCII码和扩展ASCII码满足了西语国家的需求,但是,随着计算机在世界范围内的普及,对于亚洲国家,如中日韩等国来说,他们使用的符号很多,ASCII字符编码标准远远不能满足其需要,于是这些国家便针对本国的字符集指定了相应的字符编码标准,如GB2312、BIG5、JIS等仅适用于本国字符集的编码标准。这些字符编码标准统称为ANSI编码标准,这些ANSI编码标准有一些共同的特点: 
(1)   每种ANSI字符集只规定自己国家或地区使用的语言所需的'字符';比
如简体中文编码标准GB-2312的字符集中就不会包含韩国人的文字。 (2)   ANSI字符集的空间都比ASCII要大很多,一个字节已经不够,绝大多
数ANSI编码标准都使用多个字节来表示一个字符。 (3)   ANSI编码标准一般都会兼容ASCII码。   
这里要特别提一下我国的几种字符编码标准:GB2312、GBK、GB18030。 字符必须编码后才能被计算机处理。计算机使用的缺省编码方式就是计算机的内码。早期的计算机使用7位的ASCII编码(标准ASCII编码),为了处理汉字,程序员设计了用于简体中文的GB2312和用于繁体中文的big5。  
GB2312(1980年)一共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。 GB2312支持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。2000年的GB18030是取代GBK1.0的正式国家标准。该标准收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。现在的PC平台必须支持GB18030,对嵌入式产品暂不作要求。所以手机、MP3一般只支持GB2312。  
    从ASCII、GB2312、GBK到GB18030,这些编码标准是向下兼容的,即同一个字符在这些标准中总是有相同的编码,后面的标准支持更多的字符。在这些编码中,英文和中文可以统一地处理。区分中文编码的方法是高字节的最高位不为0。按照程序员的称呼,GB2312、GBK到GB18030都属于双字节字符集 (DBCS)。 GB 18030是中国所有非手持/嵌入式计算机系统的强制实施标准。 

 例如,在Windows中打开记事本,"另存为"对话框的"编码"下拉框中有一项ANSI编码,ANSI是默认的编码方式。对于英文文件是ASCII编码,对于简体中文文件是GB2312编码(只针对Windows简体中文版,如果是繁体中文版会采用Big5码),在日文操作系统下,ANSI 编码代表 JIS 编码,其他语言的系统的情况类似。   
3. Unicode、UCS和UTF 
但是随着互联网的兴起,问题又出现了。由于ANSI码的第一个特点:各个国家或地区在编制自己的ANSI码时并未考虑到其他国家或地区的ANSI码,导致编码空间有重叠,比如:汉字'中'的GB编码是[0xD6,0xD0],这个编码在其他国家的ANSI编码标准中则不一定就是该编码了。于是,同一个二进制数字可以被解释成不同的符号。因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。这样一来当在不同ANSI编码标准之间进行信息交换和显示的时候,乱码就不可避免了。 (1)Unicode 
可以想象,如果有一种编码,将世界上所有的符号都纳入其中,每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是Unicode,就像它的名字所表示的,这是一种所有符号的编码。 
实际上,在80年代就有了一个称为 UNICODE 的组织,这个组织制定了一个能够覆盖几乎任何语言的编码表,Unicode是Universal Multiple-Octet Coded Character Set的缩写,中文含义是"通用多八位编码字符集"。它是由一个名为 Unicode学术学会(Unicode.org)的机构制订的字符编码标准。在Unicode 3.0.1中就包含了 49194 个字符,将来,Unicode 中还会增加更多的字符。Unicode 的全称是 Universal Multiple-Octet Coded Character Set ,简称为 UCS。  
由于要表示的字符如此之多,所以一开始的 Unicode1.0编码就使用连续的两个字节也就是一个WORD 来表示编码,比如“汉”的UCS 编码就是 6C49。这样在 Unicode 的编码中就可以表示 256*256 = 65536 种符号了。  
直接使用一个WORD 相当于两个字节来保存编码可能是最为自然的 Unicode 编码的方式,这种方式被称为 UCS-2,也被称为 ISO 10646,,在这种编码中,每一个字符使用两个字节来进行表示,例如,“中” 使用 11598 来编码,而大写字母 A 仍然使用 65 表示,但它占用了两个字节,高位用 0 来进行补齐。  

 由于每个WORD 表示一个字符,但是在不同的计算机上,实际上对 WORD 有两种不同的处理方式,高字节在前,或者低字节在前,为了在UCS-2编码的文档中,能够区分到底是高字节在前,还是低字节在前,使用 UCS-2 的文档使用了一组不可能在UCS-2种出现的组合来进行区分,通常情况下,低字节在前,高字节在后,通过在文档的开头增加 FFFE 来进行表示。高字节在前,低字节在后,称为大头在前,即Big Endian,使用 FFFE 来进行表示。这样,程序可以通过文档的前两个字节,立即判断出该文档是否高字节在前。  
Endian 这个词出自 《格列佛游记》,小人国的内战就源于吃鸡蛋时要先吃大头 big endian 还是小头 little-endian,并由此发生了内战。  
理想与现实  
UCS-2 虽然理论上可以统一编码,但仍然面临着现实的困难。 
首先,UCS-2 不能与现有的所有编码兼容,现有的文档和软件必须针对 Unicode 进行转换才能使用。即使是英文也面临着单字节到双字节的转换问题。  
其次,许多国家和地区已经以法律的形式规定了其所使用的编码,更换为一种新的编码不现实。比如在中国大陆,就规定 GB2312 是大陆软件、硬件编码的基础。 
第三,现在还有使用中的大量的软件和硬件是基于单字节的编码实现的,UCS-2 的双字节表示的字符不能可靠的在其上工作。 
 Unicode字符集在做国际化软件中显的尤为重要,比如中国软件转成越南文,韩文,日文等等,低端的如VB,C++等,高端的如Java,Net等,都会用到。Unicode目标是将世界上绝大多数国家的文字、符号都编入其字符集,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求,以达到支持现今世界各种不同语言的书面文本的交换、处理及显示的目的,使世界范围人们通过计算机进行信息交换时达到畅通自如而无障碍。由于一个Unicode字符用多个字节表示。这样Unicode编码在不同平台存储时就要注意其字节序了。比如:采用标准Unicode编码的'中'在X86平台上(big endian)的存储就是'2D4E',而在SPARC Solaris上(little endian)的存储则是'4E2D'。 (2) UCS  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值