Python文本和字節序列

 

ASCII碼

早期人們用8位二進制來編碼英文字母(最前面的一位是0)編碼

也就是說,將英文字母和一些經常使用的字符和這128種二進制0、1串一一對應起來,spa

好比:大寫字母「A」所對應的二進制位「01000001」,轉換爲十六進制爲41。code

 

在美國,這128是夠了,可是其餘國家不夠,他們的字符和英文是有出入的,對象

好比:在法語中在字母上有注音符號,如 é 。blog

因此各個國家就決定把字節中最前面未使用的那一個位拿來使用,原來的128種狀態就變成了256種狀態,unicode

好比:é就被編碼成130(二進制的10000010)。字符串

 

爲了保持與ASCII碼的兼容性,通常最高位爲0時和原來的ASCII碼相同,最高位爲1的時候,各個國家本身給後面的位(1xxx xxxx)賦予他們國家的字符意義。兼容性

這就成了不一樣國家有不一樣國家的編碼方式,因此若是給你一串二進制數,想要解碼,就必須知道它的編碼方式,否則就會出現咱們有時候看到的亂碼 。亂碼

 

Unicode碼

Unicode爲世界上全部字符都分配了一個惟一的數字編號,這個編號範圍從 0x000000 到 0x10FFFF(十六進制)二進制

每一個字符都有一個惟一的Unicode編號,這個編號通常寫成16進制,在前面加上U+。

例如:「馬」的Unicode是U+9A6C。

Unicode就至關於一張表,創建了字符與編號之間的聯繫

 

它是一種規定,Unicode自己只規定了每一個字符的數字編號是多少,並無規定這個編號如何存儲。

同時轉換爲二進制形式的存儲方法能夠有:UTF-八、UTF-1六、UTF-32

 

UTF-8

UTF-8就是使用變長字節表示,就是使用的字節數可變,

這個變化是根據 Unicode 編號的大小有關,編號小的使用的字節就少,編號大的使用的字節就多。使用的字節個數從1到4個不等。

編碼規則:

① 對於單字節的符號,字節的第一位設爲0,後面的7位爲這個符號的Unicode碼,所以對於英文字母,UTF-8編碼和ASCII碼是相同的。 

② 對於n字節的符號(n>1),第一個字節的前n位都設爲1,第n+1位設爲0,後面字節的前兩位一概設爲10,剩下的沒有說起的二進制位,所有爲這個符號的Unicode碼 。

例子:

「馬」的Unicode編號是:0x9A6C,整數編號是39532,對應的二進制是 1001 1010 0110 1100,

將二進制填入就爲: 11101001 10101001 10101100 。

因此,馬的字節序列爲:b'\xe9\xa9\xac'

 

UTF-16

UTF-16使用變長字節表示 

① 對於編號在U+0000到U+FFFF的字符(經常使用字符集),直接用兩個字節表示。 

② 編號在 U+10000到U+10FFFF之間的字符,須要用四個字節表示。

UTF-16 也有字節的順序問題(大小端),因此就有UTF-16BE表示大端,UTF-16LE表示小端。

 

UTF-32 

這個就是字符所對應編號的整數二進制形式,四個字節,這個就是直接轉換。

好比:馬的Unicode爲:U+9A6C,那麼直接轉化爲二進制,它的表示就爲:1001 1010 0110 1100。

計算機在存儲器中排列字節有兩種方式:大端法和小端法,大端法就是將高位字節放到底地址處,好比0x1234, 計算機用兩個字節存儲,一個是高位字節0x12,一個是低位字節0x34,

UTF-32用四個字節表示,處理單元爲四個字節(一次拿到四個字節進行處理),若是不分大小端的話,那麼就會出現解讀錯誤

咱們能夠根據他們高低字節的存儲位置來判斷他們所表明的含義,因此在編碼方式中有 UTF-32BE 和 UTF-32LE ,分別對應大端和小端,來正確地解釋多個字節(這裏是四個字節)的含義。

 

字符問題補充

一個字符串 是一個字符序列

在2015年,字符最佳定義是Unicode字符。

所以Python3的str對象中獲取的元素是Unicode字符,至關於Python2的unicode對象中獲取的元素。

 

Unicode標準字符的標識 具體的字節表述 進行明確區分:

(1)字符的標識(碼位):以4~6個十六進制數字表示,(字母A碼位是U+0041)

(2)字節表述:取決於所用的編碼。在UTF-8編碼中,A(U+0084)碼位編碼成單個字符\x41

二進制序列類型bytes或bytesarray對象的各個元素都是介於0~255之間的整數。

bytes對象的切片仍是bytes對象,bytesarray對象的切片仍是bytesarray對象。

s[0] == s[:1] 只對str類型成立。

相關文章
相關標籤/搜索