首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

字符编码跟URL编码的学习

2012-09-02 
字符编码和URL编码的学习??第一章 名词解释[1]【注】以下内容来自我好朋友日志,请参阅参考文献[1]???字、字符

字符编码和URL编码的学习

?

?

第一章 名词解释[1]

【注】以下内容来自我好朋友日志,请参阅参考文献[1]

???字、字符、字符集、字符集编码、字符集编码格式。下面我就尝试对这几个概念做个解释。

?

?1、字

???? 字是形而上的东西,也就是它没有具体的实物,它可能有音形义等外在表现。有些字没有音,如:“?”(“问号”只是“?”的名字,不是“?”的发音);有些字没有形,如:字符串结束符等不可显示字符,它们不可见,但有特殊的作用;有些字没义,这我就不能举例,只要一举例它就有义,但只要你不理它,所有的字都是没有义的,因为意由心生。

?

2、字符

???? 字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等[2]。

???? 表示字的符号就是字符(绝对是望文生意),即字的形。在生活中,我们常常把字符当成字,这是一种习惯,因为形而上的东西太难说清楚了,所以大家明白在说什么就够了,不用去深度挖掘它的概念,不然到最后怎么讲也讲不清了。

?

3、字符集

??? 字符集就是多个字符的集合。因此你可以随便抓几个字符凑在一起,然后说这就是一个字符集。但在计算机世界里为了交流的目的,一定要用和别人相同的或者兼容的字符集,不然在电脑A中的字符在电脑B中找不到,就会有字符显示的问题。因此字符集要有标准,或者说规范、协议、约定等。

??? 在国内常见的标准字符集有:ANSII、ISO-8859-1、GB2312、BIG5、CJK、GBK、GB18030、UCS、Unicode等。字符集之间有兼容性的问题,如果说字符集A兼容字符集B,那只有一种情况:A包含B中所有字符。在上面的字符当中,ASCII是最小的字符集,被其它字符集兼容。而UCS和Unicode几乎是最大的字符集,它们俩基本相互兼容,而其它所有字符集都是它们的子集。

?

4、字符集编码

??? 计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。在一个字符集当中,字符的一个排列就应该可以说是一种编码(我猜的,没有人告诉我怎么定义,估且先这么说吧),每个字符的编码就是它在排列中的序号。为了交流的目的,一定要和别人使用相同的或者兼容的字符集编码,因此上述常见的字符集也各有相应编码标准。因为人们在制定这些字符集,同时也制定了相应的编码,所以现在基本上可将上述字符集都看成有序集。字符集编码之间同样有兼容问题,且只有大的字符集的编码才能兼容小的字符集的编码。如果说字符集A的编码兼容字符集B的编码,那首先是A兼容B,其次是B中所有字符在A和B中都有相同的编码。

?

5、字符集编码格式

???? 对编码的表示方式就是编码格式。格式有两点作用,一是能够指出所表示的编码值;二是当不同字符的编码按这个格式表示成二进制编码并且连接成一个串时,它能够把这个串正确分开,还原成未连接前的状态。不同的格式也有兼容的问题,如果格式A兼容格式B,则按格式A的去看格式B的所有编码串,能解码得到相同的字符串。上述字符集的编码格式也有相应的规定。例如:ASCII字符集只有128个字符,所以只要7个比特就可以全部表示出来,因此ASCII格式用一个字节表示一个字符,最高位固定为0;ISO-8859-1有256个字符,因此ISO-8859-1格式用一个字节表示一个字符,而且兼容ASCII格式。其它的格式当中,GB2312格式兼容ASCII格式,GBK格式兼容GB2312格式,GB18030格式兼容GBK格式。还有一种使用较广的编码格式utf-8,它是Unicode字符集的编码格式,只兼容ASCII格式。国内常用GBK格式,因此utf-8格式和GBK格式的不兼容问题常给我们造成麻烦。幸好Unicode字符集兼容GBK字符集(但它们的编码不兼容),只要使用的字符不超过GBK字符集,我们就可以在两者之间做转换。

?

第二章 Unicode[3]

1、UCS(Universal Character Set, 通用字符集)[4]

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

??Unicode 是基于通用字符集(Universal Character Set)的标准来发展,并且同时也以书本的形式(The Unicode Standard,目前第五版由Addison-Wesley Professional出版。ISBN-10:0321480910)对外发表。

?

2、Unicode 的编码和实现

大概来说,Unicode 编码系统可分为编码方式和实现方式两个层次。

?

2.1 编码方式

  Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。Unicode用数字0-0x10FFFF来映射这些字符,最多可以容纳1114112个字符,或者说有1114112个码位。码位就是可以分配给字符的数字。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。

  Unicode字符集可以简写为UCS(Unicode Character Set)。早期的Unicode标准有UCS-2、UCS-4的说法。UCS-2用两个字节编码,UCS-4用4个字节编码。UCS-4根据最高位为0的最高字节分成2^7=128个group。每个group再根据次高字节分为256个平面(plane)。每个平面根据第3个字节分为256行 (row),每行有256个码位(cell)。group 0的平面0被称作BMP(Basic Multilingual Plane)。将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。

  每个平面有2^16=65536个码位。Unicode计划使用了17个平面,一共有17*65536=1114112个码位。在Unicode 5.0.0版本中,已定义的码位只有238605个,分布在平面0、平面1、平面2、平面14、平面15、平面16。其中平面15和平面16上只是定义了两个各占65534个码位的专用区(Private Use Area),分别是0xF0000-0xFFFFD和0x100000-0x10FFFD。所谓专用区,就是保留给大家放自定义字符的区域,可以简写为PUA。

  平面0也有一个专用区:0xE000-0xF8FF,有6400个码位。平面0的0xD800-0xDFFF,共2048个码位,是一个被称作代理区(Surrogate)的特殊区域。代理区的目的用两个UTF-16字符表示BMP以外的字符。在介绍UTF-16编码时会介绍。

  如前所述在Unicode 5.0.0版本中,238605-65534*2-6400-2408=99089。余下的99089个已定义码位分布在平面0、平面1、平面2和平面14上,它们对应着Unicode目前定义的99089个字符,其中包括71226个汉字。平面0、平面1、平面2和平面14上分别定义了52080、3419、43253和337个字符。平面2的43253个字符都是汉字。平面0上定义了27973个汉字。

?

2.2 实现方式

  在Unicode中:汉字“字”对应的数字是23383。在Unicode中,我们有很多方式将数字23383表示成程序中的数据,包括:UTF-8、UTF-16、UTF-32。UTF是“UCS Transformation Format”的缩写,可以翻译成Unicode字符集转换格式,即怎样将Unicode定义的数字转换成程序数据。例如,“汉字”对应的数字是0x6c49和0x5b57,而编码的程序数据是:


?

?

[1] 油头饼日志,http://user.qzone.qq.com/948509263/blog/1283446231

[2]字符集, http://baike.baidu.com/view/51987.htm

[3]Unicode, http://baike.baidu.com/view/40801.htm

[4]UCS, http://baike.baidu.com/view/935284.htm

热点排行