字串是一種我們平時使用比較多的型別,字串和其他資料型別相比有個特殊的問題,令我們比較頭疼的問題,那就是編碼問題。
因為計算機只能處理數字,如果需要處理文字,就需要將其轉換為數字後才能處理。最早計算機在設計的時候採用的是8位(位元(bit) )二進位制為乙個位元組(byte),為了解決亂碼問題,所以乙個位元組能表示的最大的數就是255(二進位制中11111111=十進位制255),如果要表示更大的數就需要使用更多的位元組才可以。比如兩個位元組表示的最大數為
65535
。由於計算機是由美國人發明的,因此最早有127個字元被編碼到計算機中,因為這已經能滿足美國人的計算機的日常使用了,127個字元也就是大小寫英文本母、數字
和一些特殊符號,這個編碼被稱為
ascii
編碼。比如a
表示為65
但是乙個位元組要處理中文顯然是不夠的,至少需要兩個位元組,而且還不能和
ascii
碼衝突,所以我們中國制定了gb2312
編碼,用來把中文編碼進去。但是全世界的語言何止上百種,各國有各國的標準編碼,那麼就不可避免出現編碼的衝突,那麼就會在多語言共用的文字中會出現亂碼問題。
unicode
就應運而生。uncode
將所有的語言就編碼到一套編碼中,那麼就不會出現亂碼了。
unicode標準也在不斷發展,但最常用的是用兩個位元組表示乙個字元(如果要用到非常偏僻的字元,就需要4個位元組)。現代作業系統和大多數程式語言都直接支援unicode。
字元a
在ascii
編碼中十進位制表示為65
,二進位制表示為01000001
;
漢字中
已經超出了ascii編碼的範圍,用unicode編碼是十進位制的20013
,二進位制的01001110 00101101
。
你可以猜測,如果把ascii編碼的a
用unicode編碼,只需要在前面補0就可以,因此,a的unicode編碼是00000000 01000001
。
新的問題又出現了:如果統一成unicode編碼,亂碼問題從此消失了。但是,如果你寫的文字基本上全部是英文的話,用unicode編碼比ascii編碼需要多一倍的儲存空間,在儲存和傳輸上就十分不划算。
所以,本著節約的精神,又出現了把unicode編碼轉化為「可變長編碼」的utf-8編碼。utf-8編碼把乙個unicode字元根據不同的數字大小編碼成1-6個位元組,常用的英文本母被編碼成1個位元組,漢字通常是3個位元組,只有很生僻的字元才會被編碼成4-6個位元組。如果你要傳輸的文字包含大量英文本元,用utf-8編碼就能節省空間:
字元ascii
unicode
utf-8
a01000001
00000000 01000001
01000001中x
01001110 00101101
11100100 10111000 10101101
從上面的**還可以發現,utf-8編碼有乙個額外的好處,就是ascii編碼實際上可以被看成是utf-8編碼的一部分,所以,大量只支援ascii編碼的歷史遺留軟體可以在utf-8編碼下繼續工作。
搞清楚了ascii、unicode和utf-8的關係,我們就可以總結一下現在計算機系統通用的字元編碼工作方式:
在計算機記憶體中,統一使用unicode編碼,當需要儲存到硬碟或者需要傳輸的時候,就轉換為utf-8編碼。
用記事本編輯的時候,從檔案讀取的utf-8字元被轉換為unicode字元到記憶體裡,編輯完成後,儲存的時候再把unicode轉換為utf-8儲存到檔案
print(ord('a'))
print(chr(65))
>>> 65
>>> a
以unicode表示的str通過encode()方法可以編碼為指定的bytes,例如:
純英文的str可以用ascii編碼為bytes,內容是一樣的,含有中文的str可以用utf-8編碼為bytes。含有中文的str無法用ascii編碼,因為中文編碼的範圍超過了ascii編碼的範圍,python會報錯。
在bytes中,無法顯示為ascii字元的位元組,用\x##顯示。反過來,如果我們從網路或磁碟上讀取了位元組流,那麼讀到的資料就是bytes。要把bytes變為str,就需要用decode()方法:
print('abc'.encode('ascii'))
print('abc'.encode('utf-8'))
print(b'abc'.decode('ascii'))
print(b'abc'.decode('utf-8'))
>>> b'abc'
>>> b'abc'
>>> abc
>>> abc
python字串和編碼
看了廖雪峰 字串和編碼,對編碼問題講的很透徹,這裡引用裡面的一段話 總結一下現在計算機系統通用的字元編碼工作方式 在計算機記憶體中,統一使用unicode編碼,當需要儲存到硬碟或者需要傳輸的時候,就轉換為utf 8編碼。用記事本編輯的時候,從檔案讀取的utf 8字元被轉換為unicode字元到記憶體...
python字串和編碼
ascii american standard coding information interchange gbk guo biao kuozhan 拼音首字母縮寫 為解決在多語言混合的文字中,顯示出來會有亂碼。unicode 編碼應運而生 字母a用ascii編碼是十進位制的65,二進位制的010...
python隨筆 字串
僅供自己使用,不喜勿噴!字串常見方法及其舉例 capitalize 把字串的第乙個字元改為大寫 casefold 把整個字串的所有字元改為小寫 center width 將字串居中,並使用空格填充至長度 width 的新字串 count sub start end 返回 sub 在字串裡邊出現的次數...