字符编码与字符集

原文链接:https://blog.csdn.net/woshimalingyi/article/details/49201319


           之前在书上看过编码和字符集,也遇到一些乱码问题。但是之前并没有真正区分字符集和字符编码。最后乱码问题还是不能解决。一般在同一个语言、平台上就能够正确显示,因为他们默认的字符集都是一样的。但是如果一个前端跟后端使用两种不同语言的时候,那么就有可能出现问题了。 

下面先来介绍一下字符编码和字符集:  

----------

一、什么是字符编码和字符集?

--------------  

我的理解:字符集和字符编码是一个双射的关系。在一套字符编码和字符集中,一个字符对应着唯一的一个编码,并且一个编码只对应一个唯一的字符。但为什么会有不同的字符集和字符编码呢?这就跟字符集的容量、使用区域、需求、字符编码长度

了。

比如:在欧美,一般直接使用ASCII码就能够满足他们的要求,因为他们只有26个字母和一些其他的字符。而且编码表示的长

度只占一个字节。但是,如果他们的程序要到我们国家来使用,那么我们如果不懂英语就完全不能够使用了。我们国家汉近10万,

所以如果要在我们国家制定一套字符集和字符编码,要将所有汉子表示出来长度就将近17个字节。针对不同要求,在国际化上面,

使用Unicode字符集(该字符集和编码几乎囊括所有国家的常用字符)。而在国内,因为还可能显示其他不常见的汉字,因

此就不能采用Unicode。为此,我们国家便发明了自己的字符集和编码----GB XXX系列,供国内使用。因此,字符集和字符编码的多样性是由于不同区域的需求多样性导致的。但是在国际上,还是使用Unicode字符集和UTF-X编码方式。 


字符编码: 字符编码顾名思义就是将我们平常所遇到的字符,诸如:“阿”,"ad","#$$%"等转换成唯一的二进制格式。不同

的字符编码转换的规则不同,能够编码的范围也不同。同时,有一些编码存在包含关系,比如UTF-8的第一个字节的编码规则跟

ASCII码完全一样。因此,对于ASCII码的编码内容使用UTF-8也能够正确解码。字符集也是一样的。因此,ASCII码编码的内容使用

UTF-8解码后,使用Unicode字符集规则来解释得到的字符串跟使用ASCII字符集解释得到的完全一样。

比如:ASCII码是单字节编码,它就只能唯一的对应256个不同字符;UTF-8\16\32(万国码中不同的编码)是将全球大部分字

符集集合之后的编码方式,由于它最长的长度是32个字节,因此它几乎可以编码表示所有国家的字符。


字符集:字符集是字符与编码之间的一个对应关系,不同字符集对于同一个编码的解释不同。也就是说,一种编码可以对应

不同的字符集,而且可能都可以识别。因为有一些字符集是集合了其他字符集的。比如:Unicode就集合了很多其他字符集就在于

字符集和字符编码是一个一一对应的双射关系。  

比如:对于同一个编码 “\u33a1”. GBK的可能解释为”你“; ISO-8859-1的解释是乱码 "?"; Unicode的解释为”你“。

原因就是因为Unicode跟GBK有部分编码解码解码规则是一样的。而ISO-8859-1是外文编码,不能识别中文 ,因此无法解

 

下面附上几种字符集和编码的对应关系图:

ASCII码:

GB2312码:

 


二、HTTP中有关字符集和字符编码的头报文

---------------------

Accept-Charset/Accept-Encoding/Accept-Language/Content-Type/Content-Encoding/Content-

Language  

在HTTP中,与字符集和字符编码相关的消息头是Accept-Charset/Content-Type,另外主区区分Accept-Charset/Accept-

Encoding/Accept-Language/Content-Type/Content-Encoding/Content-Language:  

Accept-Charset:浏览器申明自己接收的字符集,这就是本文前面介绍的各种字符集和字符编码,如gb2312,utf-8(通常我们

说Charset包括了相应的字符编码方案);  

Accept-Encoding:浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,

deflate),(注意:这不是只字符编码);  

Accept-Language:浏览器申明自己接收的语言。语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,

gbk等等;  

Content-Type:WEB服务器告诉浏览器自己响应的对象的类型和字符集。例如:Content-Type: text/html; charset='gb2312'

Content-Encoding:WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。例如:Content-

Encoding:gzip  

Content-Language:WEB服务器告诉浏览器自己响应的对象的语言。  


所以,在网络传输、跨平台的编程的时候,最好是把这些参数都显示的规定了。否则,一旦乱码出现,就会让你痛不欲生!