最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

字符编码简明教程

CharEncoding crifan 7508浏览 0评论

最后更新: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,北欧语言

更多内容可参考:

A.2. ISO/IEC 8859编码标准中的15种字符集

 

大一统的编码: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,这个名字。

 

常见字符编码的关系图解

下面,就用一个图表,来解释,各种常见字符编码之间的逻辑关系:

 

charset develop history chart

对于此图,再简单解释一下:

  • 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

转载请注明:在路上 » 字符编码简明教程

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
81 queries in 0.162 seconds, using 22.19MB memory