字符集和字符集编码详解

  GB2312\GBK\ASCII\ASNI\UNICODE\UTF-8等等,这些字眼非常常见,同时带来许多的问题。

  本文只是从理解的角度,说明以上内容的不同含义从而达到区分其用法的目的是够了的。至于实现方式,可以查阅各自的详细标准官方文档。

  先解释一个概念,什么是字符集,嗯,不解释了,我弄一个吧:{写,程,序,是,一,件,开,心,的,事} = {1,2,3,4,5,6,7,8,9,10},从今以后,1就代表写了,以此类推,呐这就是字符集了。

  计算机科学起源美国,语言以字母拼组而成,为了表示字母、数字、符号(可打印符号以及控制符号)等, 制订了第一份字符集,就是ASCII,字符集的码表只有8bit,穷举只能表示256个字符。

  

  计算机迅速发展,不同国家语言不同,为了使用计算机,只能发展自己的字符集,因为是后来的字符集,是完全兼容ASCII字符集的,中国的是GB2312,使用2bytes表示一个汉字。后面陆续发现GB2312穷举的内容不够了,依照时间顺序,以此又搞出了兼容GB2312的GBK、又搞出了兼容GBK的GB18030。

  Big5字符集和上面的差不多,只不过是繁体版本的,不过这个是一个单独分支,与上面的不存在兼容关系。

 

  其实上面是有问题的,微软搞一个操作系统,全球卖,不同国家不同字符集不同的实现方法很烦的(注意这里的实现方法),跳出两个大神,一个是ISO,说:全球统一用一套把,我来弄,叫UCS,又出来一个,是语言软件公司联盟,说:全球一套是对的,不顾我来弄吧,叫UNICODE。后来过了一段时间,全球两套字符集确实没必要,ISO和软件联盟商量了下,互相兼容了(就是一套东西了),所以很多时候,你可以理解UCS与UNICODE说的是同一个东西。

  那么好了,微软相对开心了,弄了一个codepage的东西,做了一个UNICODE与不同国家的东西映射,不同国家的自己的字符集统一叫做了ANSI,也就是说,中国大陆是ANSI可以是GBK,台湾的可以是Big5。

 

  上面仅仅是字符集,可以装订成书大家传阅,怎么放到电脑中啊。这就到了编码实现了。UTF-8、UCS-2等,说的就是这个。

    这里有一个比较重要的地方,字符集中的字符的编号与字符集编码实现中的,也就是计算机中所存储的编号是不同的。从字符集的编号到字符集编码实现的编号是需要经过一定的转换和运算的。UTF-8是指UNICODE的字符集编码,这是一个变长编码,也就是说有些字符编码是一个字节,如:a,有些字符是两个或三个字节,至于其具体的编码运算规则,请自行查阅UTF-8的相关文档。 UTF-16\UTF-32分别指16bit编码和32bit编码,应该是非变长的。USC-2是统一全部使用2bytes编码,用的不多。

 

  接下来还有最后一个问题BOM,这个是由于数据在万维网中传输引起的,不同的架构计算机的存在大端小端的不同,为了能够不同计算机在万维网下协同工作,所以在文件头部加入几个不可见字符,以标识是属于大端或小端。

  具体对应关系如下:

    EF BB BF    UTF-8
    FE FF     UTF-16/UCS-2, little endian
    FF FE     UTF-16/UCS-2, big endian
    FF FE 00 00  UTF-32/UCS-4, little endian.
    00 00 FE FF  UTF-32/UCS-4, big-endian.

 

下面是两个草图,供参考:

    

 

 

 

  

 

  

  

  

  

  

posted @ 2016-08-26 10:48  wildfox  阅读(311)  评论(0编辑  收藏  举报