字元編碼詳解
原文連結:在路上–>字元編碼簡明教程
文章目錄
- 字元編碼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