天天看點

字元編碼詳解

                  字元編碼詳解

原文連結:​​在路上​​​–>​​字元編碼簡明教程​​

文章目錄

  • ​​字元編碼ASCII簡介​​
  • ​​簡體中文字元編碼簡介​​
  • ​​繁體中文字元編碼簡介​​
  • ​​西歐字元編碼簡介​​
  • ​​大一統的編碼:Unicode​​
  • ​​Unicode的字元編碼邏輯​​
  • ​​Unicode和UTF-8,UTF-16等的關系​​
  • ​​UTF-8簡介​​
  • ​​常見字元編碼的關系圖解​​
  • ​​總結各種常見字元編碼的使用情況​​
字元編碼詳解

字元編碼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

繁體中文字元編碼簡介

上面的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,版本上,主要有之前的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

繼續閱讀