由於計算機只能對數字進行處理,當儲存字元的時候,其實在計算機內部儲存的依然是數字,只不過這些數字每乙個都對應了乙個字元,這樣就是對字元進行了一次編碼。
在unicode編碼出現之前,就有許多不同的字元編碼,這些字元編碼中每個字元與數字的對應關係都不盡相同。因此:
乙個同樣的數字在不同的字元編碼中就可能表示著不同的字元,或者相同的字元在不同的字元編碼中對應著不同的數字,在使用不同字元編碼的平台間傳遞資料的話,最終得到的字元可能與原始字元完全不同。因此不同的字元編碼之間是存在衝突的。
這些字元編碼通常都有著特定的使用環境,比如a字元編碼是用於對英文本元進行編碼的,而b字元編碼是對俄語字元進行編碼的,這樣就導致每個字元編碼都不能表示世界上所有可能用到的字元。
為了解決這些問題,有兩撥人行動了起來——這兩撥人一撥是unicode組織,另一撥是iso-10646工作小組——創造了unicode編碼,也叫萬國碼、國際碼、統一碼。
unicode為世界上的每乙個字元對應上了乙個唯一的數字(好吧我誇張了一些,unicode現在還在不斷地向其中新增新的字元)。
目前實際使用的unicode版本使用16位編碼空間,也就是每個字元使用2個位元組來表示,這樣理論上一共最多可以表示216(即65536)個字元,基本滿足各種語言的使用。實際上當前版本的unicode並未完全使用這16位編碼空間,而是保留了大量空間以作為特殊使用或將來擴充套件。這些16位unicode字元構成了基本多文種平面。基本多文種平面的字元的編碼為u+hhhh,其中每個h代表乙個十六進製制數字。
最新(但未實際廣泛使用)的統一碼版本定義了16個輔助平面,加上基本多文種平面,一共是17種平面,為了表示這17個平面中的所有字元,就需要 16 + 5 = 21 位編碼空間,比三個位元組少一點點,但是輔助平面字元仍然占用4位元組編碼空間。
unicode的實現方式不同於編碼方式。乙個字元的unicode編碼是確定的,但是在實際傳輸過程中,由於不同系統平台的設計不一致,以及出於節省空間的目的,對unicode編碼的實現方式有所不同。
unicode的實現方式稱為unicode轉換格式(unicode transformation format,簡稱為utf)。unicode常見的實現方式有utf-8(在網際網路上使用最廣的一種unicode的實現方式)、utf-16和utf-32,他們之間的關係就是,他們都是unicode的一種實現方式。
utf-8
utf-8是在網際網路上使用最廣的一種unicode的實現方式。網際網路工程工作小組(ietf)要求所有網際網路協議都必須支援utf-8編碼,網際網路郵件聯盟(imc)建議所有電子郵件軟體都支援utf-8編碼。
utf-8是一種針對unicode的可變長度字元編碼,它可以使用1~4個位元組表示乙個符號,根據不同的符號而變化位元組長度。
utf-8的編碼規則很簡單,只有兩條:
對於單位元組的符號,位元組的第一位設為0,後面7位為這個符號的unicode碼。因此對於英語字母,utf-8編碼和ascii碼是相同的。
對於n位元組的符號(n>1),第乙個位元組的前n位都設為1,第n+1位設為0,後面位元組的前兩位一律設為10。剩下的沒有提及的二進位制位,全部為這個符號的unicode碼。
下表總結了編碼規則,字母x表示可用編碼的位。
unicode符號範圍(16進製制)
utf-8編碼方式(2進製)
0000 0000-0000 007f
0******x
0000 0080-0000 07ff
110***xx 10******
0000 0800-0000 ffff
1110***x 10****** 10******
0001 0000-0010 ffff
11110*** 10****** 10****** 10******
那麼問題來了,如何判斷乙個字元用幾個位元組表示呢?(規則好難記 tot)
128個us-ascii字元只需乙個位元組編碼(unicode範圍由u+0000至u+007f)。
帶有附加符號的拉丁文、希臘文、西里爾字母、亞美尼亞語、希伯來文、阿拉伯文、敘利亞文及它拿字母則需要兩個位元組編碼(unicode範圍由u+0080至u+07ff)。
其他基本多文種平面(bmp)中的字元(這包含了大部分常用字,如大部分的漢字)使用三個位元組編碼(unicode範圍由u+0800至u+ffff)。
其他極少使用的 unicode 輔助平面的字元使用四位元組編碼。
但utf-8對所有常用的字元都可以用三個位元組表示。
Python學習筆記 Unicode
這裡簡單的說一下。下面內容基本上時從 python.core.programming.2ed 上摘的 unicode是計算機可以支援這個星球上的多種語言的秘密 在unicode之前,用的都是ascii,ascii嗎非常簡單,每個英文本元都用7位二進位制數的方式儲存在計算機內,其範圍是32到126.它...
Python學習筆記 Unicode
內容摘自 python核心程式設計 unicode是計算機可以支援這個星球上的多種語言的秘密 在unicode之前,用的都是ascii,ascii嗎非常簡單,每個英文本元都用7位二進位制數的方式儲存在計算機內,其範圍是32到126.它的實現原理這裡也不說了。但是ascii碼只能表示95個可列印的字元...
Python學習筆記 Unicode
普通字串可以用多種方式編碼成unicode字串,具體要看你究竟選擇了哪種編碼 unicodestring u hello world 將unicode轉化為普通python字串 encode utf8string unicodestring.encode utf 8 asciistring unic...