谈谈几种编码

谈谈几种编码
晓辉
0、前言
我们经常使用Unicode,UTF-8等编码。我发现一些同学对有关编码的问题不是很清楚。因此,查阅了有关资料,写下这篇小文章。
本文主要讲述ASCII,Unicode,UTF-8,GB2312-80等编码。并顺便对UTF-16,UTF-32,UCS-2,UCS-4,GBK,GB18030等编码方式进行介绍。
一、字符集(character set)和字符编码(character encoding)的概念
字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。
字符集是多个字符的集合。字符集种类比较多,每个字符集包含的字符个数不同。计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。
字符集的另一个定义是:给定一组字符,字符集给其中每一个字符分配了一个整数、或电脉冲信号等。
传统上,字符集和字符编码被认为完全一致。因为在这类标准中,一个标准会同时说明其所包含的字符以及如何对其进行编码。
在现代编码模型中,则对所包含的字符、它们的编号,以及这些编号如何被编码为一组编码单元 (code units),以及这些编码单元如何组织成一个8位元组(octet)流等概念进行了区分。
至于其中比较具体细致的概念,就不再一一详述了。
二、ASCII
ASCII(America Standard Code for Information Interchange),目前计算机中用得最广泛的字符集及其编码,是由美国国家标准局(ANSI)制定,它已被国际标准化组织(ISO)定为国际标准,称为ISO 646标准。
注意,它是用7位二进制数进行编码的。因此,编码范围为0x00~0x7F。
ASCII 主要是对英文字母及数字进行编码。
对于使用拉丁文的其它很多欧洲国家,7位的ASCII编码是不够的。因此,就出现了 ISO 8859系列标准。它是用8位二进制数进行编码。编码范围为0x00~0xFF。
ASCII码用一个字节就可以存储。
三、Unicode
说到Unicode,我们先说一下 ISO 10646 标准。ISO 10646定义了 UCS (Universal Character Set)。UCS 是所有其他字符集标准的一个超集。它包含了用于表达所有已知语言
1
的字符,包括英语、拉丁语、希腊语, 斯拉夫语,希伯来语,阿拉伯语、中文等等。
ISO 10646 定义了一个 31 位的字符集。编码范围为0x00000000~0x7FFFFFFF。最常用的字符,包括所有过去主流的编码标准中的字符,都被编码在0x0000~0xFFFD这个空间中。此空间也被称为BMP(Basic Multilingual Plane)。
UCS 不仅给每个字符分配一个代码,而且赋予了一个正式的名字。表示一个 UCS 值的十六进制数,通常在前面加上“U+”。如U+0041 代表字符“A”。UCS 字符 U+0000 到 U+007F与ISO 646 是一致的,U+0000 到 U+00FF 与 ISO 8859-1(Latin-1) 也是一致的。
历史上, 有两个独立的创立单一字符集的尝试。一个就是国际标准化组织(ISO)的 ISO 10646 项目, 另一个是由(一开始大多是美国的)多语言软件制造商组成的协会的 Unicode 项目。 幸运的是,1991年前后, 两个项目的参与者都认识到, 世界不需要两个不同的单一字符集。它们合并双方的工作成果,并为创立一个单一编码表而协同工作。目前这两个项目仍都存在并独立地公布各自的标准, 但 Unicode 协会和 ISO/IEC JTC1/SC2 都同意保持 Unicode 和 ISO 10646的编码表兼容,并共同调整任何未来的扩展。
到目前为止(2006年10月),Unicode协会最新版本是Unicode 5.0。ISO的最新标准是10646-3:2003。
在这两个标准里,所有的字符都在相同的位置并且有相同的名字。
必须注意, UCS 和 Unicode 只是给字符分配一个整数的编码表。至于如何将一串这样的字符或者说整数表示为一串字节则有很多种方法。
四、UCS-2、UCS-4、UTF-16、UTF-32
ISO 10646-1定义了UCS-2和UCS-4两种编码。它们分别用2字节和4字节进行编码。UCS-4可以对所有的UCS字符进行编码。UCS-2只能对BMP内的字符进行编码。
当时定义UCS-2只对BMP内的字符进行编码,也许考虑的是为了节省存储空间。因为在当时看来,BMP的空间已经很大了,平常使用的符号很难超出BMP。但后来情况已很明显,需要对超出BMP的字符进行编码。就引入了UTF-16编码方式。所谓UTF,即UCS transformation formats。
UTF-16的编码规则如下:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值