常见字符集
 
理解了字符集的概念还不够,还应该知道常见的字符集。
 
我们都知道中文是世界上文字符号最多的国家,中国的文字符号超过了非中文国家文字符号的总和,中华文明渊源流长啊!
 
中文的字符集也是最复杂的字符集,为了向后兼容,设计中文字符集的科学家们可谓煞费苦心。中文的字体更是复杂,有甲骨文、金文、还有简体的繁体的中文,呵呵,不是一个概念,实际上都是中文,只是表现形式和历史年代不一样罢了,光收集这些文字就是个天量的工作,更别为这些文字做字库了。
 
如果有些生僻字没字库有编号,那么就无法正确显示在技术算计上,或者没编号、也没字库,这几没法输入了。或者是编码不对,那么显示出来的将是乱码,或者内容驴唇不对马嘴。这些问题困扰了无数的“IT”民工,当然包括我在内,更多的时候,是因为对字符集本身没有一个全面认识和理解导致。其次就是对编程语言处理字符集的方式没有透彻认识导致。
 
下面就说说常见的字符集,这里主要关注与中文相关的字符集,其他非中文的鸟语字符集不是被中文字符集包含了或者就不重要,可以忽略不计。
 
常见的字符集编码如下:
ASCII
最早的也是最基本最重要的一种英美文字的字符集,也可以说是编码。ASCII被定为国际标准之后的代号为ISO-646。由于ASCII码只使用了低7位二进制位,其他的认为无效,它仅使用了0~127这128个码位。剩下的128个码位便可以用来做扩展,并且ASCII的字符集序号与存储的编码完全相同。

ISO-8859-*
随着西欧国家的崛起,在ASCII的基础上对剩余的码位做了扩展,就形成了一系列ISO-8859-*的标准。例如为英语作了专门扩展的字符集编码标准编号为ISO-8859-1,也叫做Latin-1。由于西欧小国众多,稍有发言权的小国就纷纷在ASCII的基础上扩展形成自己的编码,这就是ISO-8859-*系列。很显然ISO-8859-*系列的码也是八位的,并且其字符集序号与存储的编码也完全相同。

Unicode
为了全世界信息的交流畅通,ISO组织制定了一套Unicode字符集方案,注意,不是编码。并做了二次修正,现在还在不断的发展完善中,因为总有新的文字被发现,被启用,尤其是中文。Unicode编码号称包含全世界的语言符号,因此Unicode常常作为不同编码间相互转码的桥梁。Unicode使用了32位二进制数据来为字符编号(不是编码),最大可容纳2的31次方个字符,真是个天文数字。不过的确太多了,就约定一部分永远不启用。因此,注意了,这里始终没说Unicode的编码,原因是Unicode有多种编码方案。
一个字符的Unicode字符编号是确定的,但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对Unicode编码的方式有所不同。 这点与前两种ASCII和ISO-8859-*大不相同。
Unicode的实现方式称为Unicode转换格式(Unicode Translation Format,简称为 UTF),分UFT-8、UTF-16、UTF-32三种。
UTF-8: 8bit变长编码,对于大多数常用字符集(ASCII中0~127字符)它只使用单字节,而对其它常用字符(特别是朝鲜和汉语会意文字),它使用3字节。
Unicode 的实现方式不同于编码方式。
一个字符的Unicode编码是确定的,但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对Unicode编码的实现方式有所不同。
Unicode的实现方式称为Unicode转换格式(Unicode Translation Format,简称为 UTF)。

UTF-8: 8bit变长编码,对于大多数常用字符集(ASCII中0~127字符)它只使用单字节,而对其它常用字符(特别是朝鲜和汉语会意文字),它使用3字节。
UTF-8是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码。UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示。如,如果是UTF8编码,则在外国人的英文IE上也能显示中文,他们无需下载IE的中文语言支持包

UTF-16: 16bit编码,是变长码,大致相当于20位编码,值在0到0x10FFFF之间,基本上就是unicode编码的实现,Java语言内部就使用这种编码,也是普通意义上的Unicode码。
UTF-32: 他对所有的Unicode字符均不做变换,直接使用编号存储!只是这种编码方案太浪费存储空间(就连1个字节就可以搞定的英文字符,它都必须使用4个字节),因而尽管使用起来方便(不需要任何转换),却没有得到普及。

GB2312
GB2312字集是简体字集,全称为GB2312(80)字集,共包括国标简体汉字6763个。

BIG5
BIG5字集是台湾繁体字集,共包括国标繁体汉字13053个。

GBK
GBK字集是简繁字集,包括了GB字集、BIG5字集和一些符号,共包括21003个字符。GBK编码是GB2312编码的超集,向下完全兼容GB2312,同时GBK收录了Unicode基本多文种平面中的所有CJK汉字。同 GB2312一样,GBK也支持希腊字母、日文假名字母、俄语字母等字符,但不支持韩语中的表音字符(非汉字字符)。GBK还收录了GB2312不包含的汉字部首符号、竖排标点符号等字符。

GB18030
GB18030是国家制定的一个强制性大字集标准,全称为GB18030-2000,它的推出使汉字集有了一个“大一统”的标准。
GB18030编码向下兼容GBK和GB2312,兼容的含义是不仅字符兼容,而且相同字符的编码也相同。GB18030收录了所有Unicode3.1中的字符,包括中国少数民族字符,GBK不支持的韩文字符等等,也可以说是世界大多民族的文字符号都被收录在内。
GBK和GB2312都是双字节等宽编码,如果算上和ASCII兼容所支持的单字节,也可以理解为是单字节和双字节混合的变长编码。GB18030编码是变长编码,有单字节、双字节和四字节三种方式。
GB18030的单字节编码范围是0x00-0x7F,完全等同与ASCII;双字节编码的范围和GBK相同,高字节是0x81-0xFE,低字节的编码范围是0x40-0x7E和0x80-FE;四字节编码中第一、三字节的编码范围是0x81-0xFE,二、四字节是0x30-0x39。

ANSI:
使用2个字节来代表一个字符的各种汉字延伸编码方式,称为ANSI编码。
在简体中文系统下,ANSI编码代表GB2312编码,在日文操作系统下,ANSI编码代表JIS编码。
 
对于这些编码,知道就行了,没必要深究,不清楚的地方可以去基唯百科上去查找:
http://wikimediafoundation.org/wiki/Home
 
对于这些编码,他们的兼容性示意图如下: