最后更新:2013-08-24
字符编码简明教程
前言
之前写了个,极其详尽的,关于字符编码的教程:
由于内容太多,所以,新手学习起来,相对比较耗时和繁琐。
此处,为了更方便的,快速学习和了解,我们,尤其是中国人,相对常见的那些字符编码:
GB2312,GBK,GB18030
以及其他在编程实践中比较容易遇到的:
ASCII,UTF-8,Unicode,ISO8859-1
以及,其他一些,也需要稍微了解一下的
繁体中文的BIG5
等编码,以及这些编码之间的逻辑关系。
所以,特此专门,去写个,相对篇幅不长的,容易理解和看懂的,关于字符编码的简明教程。
换句话说:
如果只是想要了解常见的字符编码,则看看此文,就差不多了;
如果想要了解详细的,关于每个字符编码的编码逻辑等细节内容,还是需要去看:字符编码详解
此文的目的,只是为了第一点:让不熟悉字符编码的人,看了此文,对于各种字符编码,有个基本的了解。
字符编码ASCII简介
计算机中,目前用的最广泛,也是最基本的,算是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 |
从包含的字符个数上:
GB13000和GBK基本上是一样的(但是编码不兼容) |
中文编码和微软的代码页的关系是:
GB2312==旧的CP936 GBK==新的CP936 GB18030==CP54936 |
中文字符编码在应用中的情况
此处,简单说说,据我所知的,中文字符编码,在实际使用中的情况:
网页中的编码,一般是通过charset指定的;
很多中文网页,charset用的GB2312;
但是部分网页,所声明的编码和实际编码不同:
虽然charset指定的是GB2312,但是实际上用的是(包含了更多字符的)GBK;
导致的情况是:
如果你按照GB2312去解码,由于部分字符是属于GBK的,而非GB2312,则会出现解码失败
解决办法是:
尝试用GBK,或包含更多字符的GB18030去解码,则一般都可以正常解码的。
相关内容:
【整理】关于HTML网页源码的字符编码(charset)格式(GB2312,GBK,UTF-8,ISO8859-1等)的解释
繁体中文字符编码简介
上面的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
相关内容:
1. 注意,实际上,ISO 8859和ISO-8859,不是同一个东西,是有点细微差别的,详见:
2.2.2.5. ISO 8859和ISO-8859的区别和联系
2.另外:
- ISO8859-2:Latin-2,中欧语言
- ISO8859-3:Latin-3,南欧语言
- ISO8859-4:Latin-4,北欧语言
更多内容可参考:
大一统的编码:Unicode
字符编码发展到最后,要考虑的问题是:
最好用,单独的,某个字符编码,可以囊括世界上所有的字符,包括以后可能出现的字符
此种编码,就是后来的Unicode。
Unicode,版本上,主要有之前的Unicode 1.1和最新的Unicode 2.0;
Unicode的字符编码逻辑
Unicode编码目前有两种,UCS-2和UCS-4;
目前最常用的是UCS-2,即用2个字节=2个Byte=16个bit=16位,来表示字符。
理论上,最多可以表示2^16=65536个=6万多个字符,足够支持目前世界上所有的字符了。
Unicode和UTF-8,UTF-16等的关系
需要了解的是:
Unicode,只是一个字符集的概念,即表示,设计了一套逻辑,可以用不同的值,表示不同的字符,这个是Unicode标准做的事情,即支持了所有的字符;
但是,要把Unicode,在计算机中实现出来,表示出来,以及把Unicode字符,从从一个地方发送到别的地方,即字符交换,方面,则涉及到,实际上所采用的字符编码;
把字符集Unicode表示出来的字符编码,有多种,最常见的有,UTF-8和UTF-16,次常见的还有UTF-32。
即:
Unicode是字符集的概念,UTF-8,UTF-16是字符编码的概念;
UTF-8,UTF-16等,只是Unicode的实现方式之一。
UTF-8简介
明白了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是最基本的,最早的,用的最广泛的,字符编码
- 但是只支持普通的基本字符,即常见英文字母,数字,下划线等
- 简体中文的编码
- 发展路径依次是:GB2312 < GBK < GB18030
- 对应的所包含的字符个数,也是以此增加
- 繁体中文的编码
- 最常见的是BIG5
- 西欧字符编码
- 最常用的就是ISO8895-1
- ISO8859是从1到15,是一系列的编码
- ISO8859-1是属于ISO8859系列编码其下的,但是用的最广泛的的
- 统一了世界上所有字符的Unicode
- Unicode,可以叫做大一统的编码,包含了世界上所有的字符
- 但是Unicode只是字符编码集
- 字符(编码)集,只表示包含了哪些字符
- 字符编码,表示了用何种方式去表示此字符集
- Unicode这个字符集,可以有多种字符编码表示出来,最常见的包括UTF-8,UTF-16,UTF-32等等
- 最最常用的是UTF-8
总结各种常见字符编码的使用情况
此处,简单总结一下,关于各种编码的使用方面的情况:
- 各种情况下,包括程序代码中处理字符,文件内容所用字符编码,网页中的charset,最最常用的,要属UTF-8
- 对于中文方面,相对比较常用的是GBK
- 其次,也还是有很多之前的中文网页用GB2312的
- 西欧等字符和网页,多数使用ISO8859-1
- 繁体中文,一般用BIG5