1. 程式人生 > >字元編碼與字符集(Encoding&CharSet)——害死多少程式設計師

字元編碼與字符集(Encoding&CharSet)——害死多少程式設計師

           之前在書上看過編碼和字符集,也遇到一些亂碼問題。但是之前並沒有真正區分字符集和字元編碼。最後亂碼問題還是不能解決。一般在同一個語言、平臺上就能夠正確顯示,因為他們預設的字符集都是一樣的。但是如果一個前端跟後端使用兩種不同語言的時候,那麼就有可能出現問題了。

下面先來介紹一下字元編碼和字符集:

----------

一、什麼是字元編碼和字符集?

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

我的理解: 字符集和字元編碼是一個雙射的關係。在一套字元編碼和字符集中,一個字元對應著唯一的一個編碼,並且一個編碼只對應一個唯一的字元。但為什麼會有不同的字符集和字元編碼呢?這就跟字符集的容量、使用區域、需求、字元編碼長度

了。

比如:在歐美,一般直接使用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伺服器告訴瀏覽器自己響應的物件的語言。

所以,在網路傳輸、跨平臺的程式設計的時候,最好是把這些引數都顯示的規定了。否則,一旦亂碼出現,就會讓你痛不欲生!