常用字符集
1.ASCII(American Standard Code for Information Interchange,美国信息互换标准代码),是基于常用的英文字符的
一套电脑编码系统。每一个ASCII码与一个8位(bit)二进制数对应。其最高位是0,相应的十进制数是0-127。比如数字字符"0"的
编码用十进制表示就是数字48。另有128个拓展的ASCII码,最高位是1,由一些图形和画线符号组成。ASCII是现今最通用的单字节
编码系统。
ASCII用一个字节来表示字符,最多能够表示256个字符。随着计算机的普及,许多国家都将本地语言符号导入计算机中,拓展了计
算机中的字符集范围,于是就出现了各种不同的字符集。
ASCII对应的部分字符(32-127)(0-31这段范围的编码对应的字符包括回车换行符以及其他无法显示的字符):
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[/]^_`abcdefghijklmnopqrstuvwxyz{|}~
2.ISO-8859-1
因为ASCII码中缺少一些其他字符,为此可以通过指定128以后的字符来扩展ASCII码。国际标准组织(ISO)定义了几个不同的字符
集,他们是在ASCII码基础上增加了其他语言和地区需要的字符。其中最常用的是ISO-8859-1,通常叫做Latin-1。Latin-1包括
了书写所有西方欧洲语言不可缺少的附加字符,其中0-127的字符与ASCII码相同。ISO 8859另外定义了10个适用于不同文字的字
符集(8859-2到8859-10和8859-15),还有4个字符集(8859-11到8859-14)正在开发中。这些字符集共享0-127的ASCII码,
只是每个字符集都包含了128-255的其他字符。
3.GB2312和GBK
GB2312是中华人民共和国国家标准汉字信息交换用编码,全称《信息交换用汉字编码字符集-基本集》,标准号为GB2312-80,是一
个有中华人民共和国国家标准总局发布的关于简化汉字的编码,通行于中国大陆和新加坡,简称国标码。
因为中文字符数量较多,所以采用两个字节来表示一个字符,分别称为高位和低位。为了和ASCII码有所区别,中文字符的每一个字节的最
高位都用1来表示。GB2312字符集是几乎所有的中文系统和国际化的支持的中文字符集,也是最基本的中文字符集。它包含了大部分常
用的一、二级汉字和9区的符号,其编码范围是高位0xa1-0xfe,低位也是0xa1-0xfe,汉字从0xb0a1开始,结束与0xf7fe。
为了对更多的字符和符号进行编码,由电子部科技质量司和国家技术监督局标准化司与1995年12月颁布了GBK(K是“扩展”的汉语拼音
第一个字母)编码规范。需要注意的是:GBK不是国家标准,它只是规范。
由于不同国家间的编码字符集不同,于是不能相互转换,为了解决这个问题,统一全世界的字符编码,由Unicode协会制定颁布了
Unicode编码。
4.Unicode
Unicode(统一的字符编码标准集)使用0-65535的双字节无符号数对每一个字符进行编码。它不仅包含来自英语和其他西欧国家字母表
中常见的字母和符号,也包含来自古斯拉夫语、希腊语、希伯来语、阿拉伯语和梵语的字母表。另外还包含汉语和日语的象形汉字和韩国
的Hangul音节表。
目前已经定义了40000多个不同的Unicode字符,剩余25000个空缺留给将来扩展用。其中大约20000个字符用于汉字,另外11000左右
的字符用于韩语音节。Unicode中0-255的字符与ISO8859-1中的一致。
Unicode编码对于英文字符采取前面加“0”字节的策略实现等长兼容。如“a”的ASCII码为0x61,Unicode码就为0x00,0x61。
5.UTF-8
使用Unicode编码,一个英文字符要占用两个字节,在Internet上,大多数的信息都是用英文来表示的,如果都采用Unicode编码,将
会是数据量增加一倍。为了减少存储和传输英文字符数据的数据量,可以使用UTF-8编码。
UTF-8全称是Eight-bit UCS Transformation Format (UCS,Univeral Character Set,通用字符集,UCS是所有其他字符
集标准的一个超集)。对于常用的字符,即0-127的ASCII字符,UTF-8用一个字节来表示,这意味着只包含7位ASCII字符的字符数据在
ASCII和UTF-8两种编码方式下是一样的。
如果字符对应的Unicode码是0x0000(0),或在0x0080(128)与0x007f(127)之间,对应的UTF-8编码是两个字节,如果字符对应的Unicode编码在
0x0800(2048)与0xffff(65535)之间,对应的UTF-8编码是三个字节。因为中文字符的Unicode编码在0x0800与0xffff之间,所以数据如果是中文,采用UTF-8编码数据量会增加50%。
Unicode与UTF-8转换的规则简述如下:
(1)如果Unicode编码的16位二进制数的前9位是0,则UTF-8编码用1字节来表示,这个字节首位是“0”,剩下的7位与原二进制数据的后
7位相同。例如:
Unicode编码:/u0061 = 00000000 01100001
UTF-8编码:01100001 = 0x61
(2)如果Unicode编码的16位二进制数的头5位是0,则UTF-8编码用2个字节来表示,首字节以“110”开头,后面的5位与原二进制数据除去
前5个零后的最高5位相同;第二个字节以“10”开头,后面的6位与原二进制数据中的低6位相同。例如:
Unicode编码:/u4E2D = 00000000 10101001
UTF-8编码:11000010 10101001 = 0xC2 0xA9
(3)如果不符合上述两个规则,则用三个字节表示。第一个字节以“1110”开头,后四位为原二进制数据的高四位;第二个字节以“10”开头,
后六位为原二进制数据中间的六位;第三个字节以“10”开头,后六位为原二进制数据的低六位。例如:
Unicode编码:/u4E2D = 01001110 00101101
UTF-8编码:11100100 10111000 10101101 = 0xE4 0xB8 0xAD
注意:在UTF-8编码的多字节串中,第一个字节开头“1”的数目就是整个串中字节的数目。