1.基础知识
我们在计算机屏幕上看到的是实体化的字符,而计算机存储介质中存放的实际上是二进制的比特流。这两者之间有一个转换规则,类比密码学中的加密解密,从“字符”到“比特流”称之为“编码”,从“比特流”到“字符”则称之为“解码”。这也引出了下面我们要讲的几个概念。
1.1.字符集
字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。 字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集有:ASCII字符集、GB2312字符集、BIG5字符集、 GB18030字符集、Unicode字符集等。那么为什么会有那么多字符集标准呢?这是因为,很多规范和标准在最初制定时并没有意识到这将会是以后全球普适的准则,或者出于组织本身利益考虑想从本质上区别于现有标准。于是,就产生了那么多具有相同效果但又互不兼容的标准。
1.2.字符编码
字符编码(Character encoding),是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数序列、8位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。一般而言,会直接将字符在字符集中的位置,或者说是码点(code point),作为编码后的值。故而,“字符集”和“字符编码”二者是紧密耦合的(也有例外,后面我们会讲到)。因此,某种字符集也可以说成是某种字符编码方式,例如,当我们说到“ASCII”时,既可以指代ASCII字符集,也可以指代ASCII编码。
2.常用字符集&字符编码
2.1.ASCII
ASCII(American Standard Code for Information Interchange,美国信息互换标准编码)是基于基础拉丁字符的一套电脑编码系统。它主要用于显示现代英语,而其扩展版本EASCII(Extended ASCII)则可以勉强显示其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。
ASCII用7bit来编码字符,共128个码位,由于计算机1个字节是8bit,所以最高位为0,即00000000-01111111(0x00-0x7F)。其中有95(十进制32-126)个可打印字符,包括常用的字母、数字、标点符号等,另外还有33(十进制0-31及127)个控制字符。ASCII字符编码对应规则如下:
ASCII是美国人设计的,只能支持基础拉丁字符,而当计算机发展到欧洲,欧洲其它不只是用基础拉丁字符的国家(即用更大的派生拉丁字符集)该怎么办呢?最简单的办法就是将ASCII没有用到的第8位也用上,这样能表达的字符个数就达到了256个,相较原来,增长了一倍, 这就是EASCII。EASCII基本解决了整个西欧的字符编码问题。但是对于欧洲其它地方如北欧,东欧地区,256个字符还是不够用,因此出现了ISO 8859。为解决256个字符不够用的问题,ISO 8859采取的不再是单个独立的编码规则,而是由一系列的字符集(共15个)所组成,分别称为ISO 8859-n(n=1,2,3…11,13…16,没有12)。其每个字符集对应不同的语言,如ISO 8859-1对应西欧语言,ISO 8859-2对应中欧语言等。其中大家所熟悉的Latin-1就是ISO 8859-1的别名,它表示整个西欧的字符集范围。需要注意的的是,ISO 8859-n与ASCII是兼容的,即其0000000-01111111(0x00-0x7f)范围段与ASCII保持一致,而10000000-11111111(0x80-0xFF)范围段被扩展用到不同的字符集。EASCII字符编码对应规则如下:(含表格符号、计算符号、希腊字母和特殊的拉丁符号等)
2.2.中文编码
为了扩充ASCII,以用于显示本国的语言,不同的国家和地区制定了不同的标准,由此产生了GB2312(简体中文),BIG5(繁体中文),JIS(日文)等各自的编码标准。这一节我们将集中叙述几种常用的中文编码标准。