字符编码

来源:互联网 发布:java 用模板导出excel 编辑:程序博客网 时间:2024/06/12 01:04

1、字符编码发展

上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。ASCII码一共规定了128个字符的编码,比如空格”SPACE”是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。

  • 0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为8、9、10 和13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。
  • 32~126(共95个)是字符(32是空格),其中48~57为0到9十个阿拉伯数字。
  • 65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。

对于其它使用其它语言文字的国家显然ASCII码是不能胜任的。其它国家就对字符集进行了各种扩展。

中文字符编码标准

  • GB2312(1980年):16位字符集,收录有6763个简体汉字,682个符号,共7445个字符。
    优点:适用于简体中文环境,属于中国国家标准,通行于大陆,新加坡等地也使用此编码;
    缺点:不兼容繁体中文,其汉字集合过少。
  • GBK(1995年):16位字符集,收录有21003个汉字,883个符号,共21886个字符。
    优点:适用于简繁中文共存的环境,为简体Windows所使用,向下完全兼容GB2312,向上支持 ISO-10646 国际标准 ;所有字符都可以一对一映射到unicode2.0上。
    缺点:不属于官方标准,和big5之间需要转换;很多搜索引擎都不能很好地支持GBK汉字。
  • GB18030(2000年):32位字符集;收录了27484个汉字,同时收录了藏文、蒙文、维吾尔文等主要的少数民族文字。
    优点:可以收录所有你能想到的文字和符号,属于中国最新的国家标准;
    缺点:目前支持它的字库较少。
  • BIG5(1992):BIG5收录13461个汉字和符号,通行于台湾、香港地区的一个繁体字编码方案,BIG5是台湾资讯工业策进会根据以上标准制定的编码方案。BIG5码是双字节编码方案,其中第一个字节的值在OXAO-OXFE之间,第二个字节在OX40-OX7E和OXA1-OXFE之间。

2、Unicode编码

世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。为什么电子邮件常常出现乱码?就是因为发信人和收信人使用的编码方式不一样。
可以想象,如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是Unicode,就像它的名字都表示的,这是一种所有符号的编码。Unicode的学名是”Universal Multiple-Octet Coded Character Set”,简称为UCS。UCS可以看作是”Unicode Character Set”的缩写。Unicode当然是一个很大的集合,现在的规模可以容纳100多万个符号。每个符号的编码都不一样,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,U+4E25表示汉字”严”。

3、UTF-8编码

UTF-8就是在互联网上使用最广的一种Unicode的实现方式。其他实现方式还包括UTF-16(字符用两个字节或四个字节表示)和UTF-32(字符用四个字节表示),不过在互联网上基本不用。重复一遍,这里的关系是,UTF-8是Unicode的实现方式之一。
UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
UTF-8的编码规则很简单,只有二条:
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
下表总结了编码规则,字母x表示可用编码的位。
Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
——————–+———————————————
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
跟据上表,解读UTF-8编码非常简单。如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。

参考资料

http://www.chi2ko.com/tool/CJK.htm
http://blog.csdn.net/liujinchengjx/article/details/1527909
http://www.unicode.org/
http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
https://zh.wikipedia.org/wiki/UTF-8
https://zh.wikipedia.org/wiki/Unicode

原创粉丝点击