当前位置:编程学习 > 网站相关 >>

字符集与字符集编码简介

 

我们知道,计算机只能识别诸如0101这样的二进制数,于是人们必须以二进制数据与计算机进行交互,或者先将人类使用的字符按一定规则转换为二进制数。

那什么是字符呢?在计算机领域,我们把诸如文字、标点符号、图形符号、数字等统称为字符。而由字符组成的集合则成为字符集,字符集由于包含字符的多少与异同而形成了各种不同的字符集。我们知道,所有字符在计算机中都是以二进制来存储的。那么一个字符究竟由多少个二进制位来表示呢?这就涉及到字符编码的概念了,比如一个字符集有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,就像它的名字所表示的,这是一种所有符号的编码。

 

Unicode是Universal Multiple-Octet Coded Character Set的缩写,中文含义是"通用多八位编码字符集"。它是由一个名为Unicode学术学会(Unicode.org)的机构制订的字符编码标准,Unicode目标是将世界上绝大多数国家的文字、符号都编入其字符集,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求,以达到支持现今世界各种不同语言的书面文本的交换、处理及显示的目的,使世界范围人们通过计算机进行信息交换时达到畅通自如而无障碍。由于一个Unicode字符用多个字节表示。这样Unicode编码在不同平台存储时就要注意其字节序了。比如:采用标准Unicode编码的'中'在X86平台上(big endian)的存储就是'2D4E',而在SPARC Solaris上(little endian)的存储则是'4E2D'。

 

(2) UCS

 

那什么又是UCS呢,它与Unicode有何关系?

 

历史上, 有两个独立创立统一字符集的尝试。一个是国际标准化组织(ISO)的ISO 10646 项目, 另一个是由(一开始大多是美国的)多语言软件制造商组成的协会(unicode.org)组织的Unicode 项目. 幸运的是, 1991年前后, 两个项目的参与者都认识到, 世界不需要两个不同的统一字符集. 它们合并双方的工作成果, 并为创立一个统一编码表而协同工作。现在,两个项目仍都存在并独立地公布各自的标准, 但Unicode 协会和ISO/IEC JTC1/SC2 都同意保持Unicode 和ISO 10646 标准的码表兼容, 并紧密地共同调整任何未来的扩展。

 

国际标准ISO 10646 定义了通用字符集(Universal Character Set) UCS。UCS 是所有其他字符集标准的一个超集. 它保证与其他字符集是双向兼容的. 就是说, 如果你将任何文本字符串翻译到UCS格式, 然后再翻译回原编码, 你不会丢失任何信息。

 

ISO 10646 定义了一个31 位的字符集。 然而, 在这巨大的编码空间中, 迄今为止只分配了前65534 个码位(0x0000 到0xFFFD). 这个UCS 的16位子集称为基本多语言面(Basic Multilingual Plane, BMP)。 将被编码在16 位BMP 以外的字符都属于非常特殊的字符(比如象形文字), 且只有专家在历史和科学领域里才会用到它们。按当前的计划, 将来也许再也不会有字符被分配到从0x000000 到0x10FFFF 这个覆盖了超过100 万

补充:综合编程 , 其他综合 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,