Unicode编码
编码这东西,有时候你还必须得花点时间研究一下。为了查看某条网络中的数据哪些地方使用了Unicode编码,我就打算花一个下午的时间来看看有关Unicode编码相关的文档。以下是我整理的笔记。 1.ASCII 谈到编码,第一个要说到的肯定是ASCII编码,相信接触计算机的人对这个都不陌生吧,这里也只简单的提到以下。ASCII 是英文American Standard Code for Information Interchange的缩写,ASCII码是目前计算机最通用的编码标准。因为在计算机的底层,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111。ASCII码一共规定了128个字符的编码,需要记住的就是以下几个,大写的字母A是65(十进制,以下同),小写字母a是97,数字0是48,数字1是49,数字9是57,记住了这几个,常见的比如字母活着数字就可以推导出来。至于要查看那些比较特殊的,g.cn就行了。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。 2.Unicode 有了ASCII后,为什么还会出现Unicode?很简单,ASCII只有128个字符,这对英语来说是够了,可是却苦了包括中国在内的很多国家,而且,就算把前面的那位0使用起来,即增加128个字符,也显然不能满足要求。在这个时候,Unicode就出现了。 可以想象,如果有一种编码,将世界上所有的符号都纳入其中,每一个符号都给予一个独一无二的编码,那么就会满足各国人民的需要了。这就是Unicode,就像它的名字都表示的,这是一种所有符号的编码。Unicode当然是一个很大的集合,现在的规模可以容纳100多万个符号。每个符号的编码都不一样,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,U+4E25表示汉字“严”。具体的符号对应表,可以查询unicode.org,使用专门的工具。 从这里可以知道,Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。比如说,汉字“严”的unicode是十六进制数4E25,转换成二进制数足足有15位(100111000100101),也就是说这个符号的表示至少需要2个字节。表示其他更大的符号,可能需要3个字节或者4个字节,甚至更多。 这里就有两个严重的问题,第一个问题是,如何才能区别unicode和ascii?计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果unicode统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的。它们造成的结果是:1)出现了unicode的多种存储方式,也就是说有许多种不同的二进制格式,可以用来表示unicode。2)unicode在很长一段时间内无法推广,直到互联网的出现。 3.UTF-8 前面已经说了,Unicode只是字符的集合,并不涉及编码方式。UTF-8就是在互联网上使用最广的一种unicode的实现方式。其他实现方式还包括UTF-16和UTF-32,不过在互联网上基本不用。重复一遍,这里的关系是,UTF-8是Unicode的实现方式之一。UTF-8是一种变长的编码方式(节约存储空间),编码规则如下(也就两条): 1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。 2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。 下表总结了编码规则,字母x表示可用编码的位。
|