字符编码详解
计算机中,目前用的最广泛,也是最基本的,算是ASCII字符编码了。
对于ASCII的简单总结就是:
ASCII就是我们最常见的,26个英文字母,加上常见的那些字符等等,加起来的,字符编码。
而对于这些字符,很容易理解,也在其他字符编码中出现,比如简体中文字符,繁体中文字符,西欧字符,Unicode等等,
所以,可以理解为:
ASCII,就是其他各种字符编码,所共有的最小集合,是其他字符编码的始祖。
对于ASCII的具体所含内容,可以总结为
ASCII字符集共27个字符
=128个字符
= 33个控制字符 + 95个可见字符
=33个控制字符 + (26个英文字母 + 常见的符号)
=NULL,…,CR,LF,VT,FF,…Space,Delete + (abc…xyzABC…XYZ + !”#$…[]^_…)
简体中文的发展历史,以此是:
1980年,国标指定的GB2312-80,简称GB2312,对应着微软最早的CP936;
1993年,国标,借鉴Unicode 1.1,再收录中国大陆、台湾、日本及韩国通用字符集的汉字,指定出国标:GB 13000.1-93,简称GB13000;
微软对于GB2312做了扩展,利用GB2312未使用的编码空间,加进去GB13000和Unicode1.1的字符,制定了GBK,对应着,微软的现在的CP936;
2000年,中国,额外又收录了藏文、蒙文、维吾尔文等主要的少数民族文字,出了国标GB18030-2000,简称GB18030,对应着微软的CP54936
对于这几个字符集的关系是:
从编码的兼容性上:
GB2312,GBK,GB18030,是兼容的,包含的字符个数,以此更多,可以写成:
GB2312 < GBK < GB18030
上面的GB2312,GBK,GB18030,都是针对于中国大陆的,简体中文;
对于台湾等地区,都是用的是繁体中文,其和我们的编码不同;
繁体中文一般都是用的是BIG5,中文一般称为大五码,其对应者微软的CP950;
欧洲包含很多国家和地区,按照地域,大概可分为,西欧,中欧,南欧,北欧,等等;
此处,在字符编码上,为了实现欧洲,如此多种的地区和语系,支持其所用的字符,然后发展处一个国际标准,叫做ISO/IEC 8859,简称ISO8859
ISO8859,其下分了很多分支,从1到15,分别叫做ISO8859-1,ISO8859-2,……,ISO8859-15
可以说:ISO8859,包含了整个欧洲所用的各种字符;
其中,最最常用的,就是:ISO8859-1,又常被称为Latin-1,表示的就是西欧字符;
ISO8859-1的实际使用情况
此处,简单说说,我之前所了解到的,ISO8859-1的使用情况。
很多网页编码,尤其是和西欧相关的,比如德文或者西欧某国家的类似的其他的网页,很多都是用的是ISO8859-1
字符编码发展到最后,要考虑的问题是:
最好用,单独的,某个字符编码,可以囊括世界上所有的字符,包括以后可能出现的字符
此种编码,就是后来的Unicode。
Unicode,版本上,主要有之前的Unicode 1.1和最新的Unicode 2.0;
Unicode编码目前有两种,UCS-2和UCS-4;
目前最常用的是UCS-2,即用2个字节=2个Byte=16个bit=16位,来表示字符。
理论上,最多可以表示2^16=65536个=6万多个字符,足够支持目前世界上所有的字符了。
需要了解的是:
Unicode,只是一个字符集的概念,即表示,设计了一套逻辑,可以用不同的值,表示不同的字符,这个是Unicode标准做的事情,即支持了所有的字符;
但是,要把Unicode,在计算机中实现出来,表示出来,以及把Unicode字符,从从一个地方发送到别的地方,即字符交换,方面,则涉及到,实际上所采用的字符编码;
把字符集Unicode表示出来的字符编码,有多种,最常见的有,UTF-8和UTF-16,次常见的还有UTF-32。
即:
Unicode是字符集的概念,UTF-8,UTF-16是字符编码的概念;
UTF-8,UTF-16等,只是Unicode的实现方式之一。
明白了Unicode和UTF-8的关系后,再来说说,UTF-8这个字符编码的逻辑:
UTF-8是一种变长的编码方式,可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
UTF-8的编码规则很简单,只有二条:
对于单字节的符号,字节的第一位设为0,后面7位为这个符号的Unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的
对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的Unicode码
下表总结了编码规则,字母x表示可用编码的位。
Unicode与UTF-8之间的编码映射关系
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编码:
“严”的Unicode是4E25,介于00008000到0000FFF之间,根据上表,“严”的UTF-8编码格式是“1110xxxx 10xxxxxx 10xxxxxx”。
然后,从“严”的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。
这样就得到了,“严”的UTF-8编码是 “11100100 10111000 10100101”,转换成十六进制就是E4B8A5。
注意:
UTF-8,是标准的写法,其他也有别人写成UTF8的,但是很多程序,是不识别此种非标准写法的。
以后,最好还是用UTF-8,这个名字。
对于此图,再简单解释一下:
ASCII是最基本的,最早的,用的最广泛的,字符编码
简体中文的编码
繁体中文的编码
西欧字符编码
统一了世界上所有字符的Unicode
此处,简单总结一下,关于各种编码的使用方面的情况:
各种情况下,包括程序代码中处理字符,文件内容所用字符编码,网页中的charset,最最常用的,要属UTF-8
对于中文方面,相对比较常用的是GBK
西欧等字符和网页,多数使用ISO8859-1
繁体中文,一般用BIG5