????計算機只能處理數字,如果要處理文本,那么就先將文本轉換為數字。最開始,一個字節(bytes
)有8個(bit
)‘11111111’,一個字節表示的最大整數是255。ASCII編碼只把大小寫英文字母、數字和一些符號編碼到計算機。但是要處理中文的時候,需要至少兩個字節,所以中國就制定了GB2312編碼。
????unicode將全世界所有語言都統一到一套編碼里面了。unicode使用兩個字節進行編碼,多余的位置用0補全。當存儲的全都是英文的時候,就會導致浪費存儲空間,因為英文只需要一個字節存儲就夠了。
????因此,又出現了把 unicode
編碼轉化為可變長編碼的‘UTF-8’編碼。UTF-8
編碼把一個 unicode
字符根據不同的數字大小編碼成1-6個字節。英文為1字節,中文3個字節。
????計算機系統通用的字符編碼工作方式:
在計算機內存中,統一使用 unicode
編碼(因為內存快),當需要保存到硬盤或傳輸的時候,就轉換為 UTF-8
編碼。
????用記事本編輯的時候,從文本讀取的 UTF-8
字符被轉換為 unicode
字符保存到內存中,編輯完成后,保存的時候,再把 unicode
轉換為 UTF-8
保存到文件。
????瀏覽網頁的時候,服務器會把動態生成的 unicode
內容轉換為 UTF-8
再傳輸到瀏覽器。
由于python
的字符串是 str
,在內存中以 unicode
表示,一個字符對應若干個字節。如果要在網絡上傳輸,或保存到磁盤上,就需要把 str
變為以字節為單位的 bytes
。
‘ABC’
和b‘ABC’
,雖然顯示的內容一樣,但前者是 ·str·,而且bytes
的每個字符只占用一個字節,python
的一個字符可以占用幾個字節。
以 unicode
表示的 str
通過 encode()
方法可以編碼為指定的bytes
:
'ABC'.encode('UTF-8')
????反過來,如果我們在網站上讀取了字節流,那么讀到的就是 bytes
。將 bytes
變為 str
,就需要用 decode()
方法:
b'ABC'.decode()
len()
計算 str
的字符數:
len('ABC')
3
len('中文')
2
len()
計算 bytes
的字節數:
len(b'ABC')
3
len(b'中文')
6