python中的內容編碼
一、python編碼簡介
1)編碼格式簡介
python解釋器在加載 .py 文件中的代碼時,會對內容進行編碼(默認ASCII),ASCII(American Standard Code for Information Interchange,美國標準信息交換代碼)是基於拉丁字母的一套電腦編碼系統,主要用於顯示現代英語和其他西歐語言,其最多只能用 8 位來表示(一個字節),即:2**8 = 256,所以,ASCII碼最多只能表示 256 個符號。顯然ASCII碼無法將世界上的各種文字和符號全部表示,所以,就需要新出一種可以代表所有字符和符號的編碼,即:Unicode
Unicode(統一碼、萬國碼、單一碼)是一種在計算機上使用的字符編碼。Unicode 是為了解決傳統的字符編碼方案的局限而產生的,它為每種語言中的每個字符設定了統一並且唯一的二進制編碼,規定雖有的字符和符號最少由 16 位來表示(2個字節),即:2 **16 = 65536,註:此處說的的是最少2個字節,可能更多。
UTF-8,是對Unicode編碼的壓縮和優化,不再使用最少使用2個字節,而是將所有的字符和符號進行分類:ascii碼中的內容用1個字節保存、歐洲的字符用2個字節保存,東亞的字符用3個字節保存。所以,python解釋器在加載 .py 文件中的代碼時,會對內容進行編碼(python3.x默認UTF-8)。
a="明" # 查看a中的方法 print(dir(a)) # 顯示a的數據類型 print(type(a)) # 顯示a的碼值 print(ord(a)) # 26126 # 將碼值轉換成對應的字符 print(chr(26126)) # 明
a="明天" # len-字符的長度print(a.__len__()) # bytes的長度 print(a.encode("utf-8").__len__())
在計算機內存中,統一使用Unicode編碼,當需要保存到硬盤或者需要傳輸的時候,就轉換為UTF-8編碼。用記事本編輯的時候,從文件讀取的UTF-8字符被轉換為Unicode字符到內存裏,編輯完成後,保存的時候再把Unicode轉換為UTF-8保存到文件:
瀏覽網頁的時候,服務器會把動態生成的Unicode內容轉換為UTF-8再傳輸到瀏覽器,所以你看到很多網頁的源碼上會有類似<meta charset="UTF-8" />
的信息,表示該網頁正是用的UTF-8編碼。
2)byte
由於Python的字符串類型是str,在內存中以Unicode表示,一個字符對應若幹個字節。如果要在網絡上傳輸,或者保存到磁盤上,就需要把str變為以字節為單位的bytes,bytes的每個字符都占有一個字節。反過來,如果我們從網絡或磁盤上讀取了字節流,那麽讀到的數據就是bytes。要把bytes變為str,就需要用decode()方法:
# 編碼 a="ABC" print(a.encode("utf-8")) b="小明" # 會報錯,中文超出了ascii範圍 # print(b.encode("ascii")) print(b.encode("utf-8")) # b‘\xe5\xb0\x8f\xe6\x98\x8e‘ # 解碼 print(b‘\xe5\xb0\x8f\xe6\x98\x8e‘.decode("utf-8")) print(b"abc".decode("ascii"))
1個中文字符經過UTF-8編碼後通常會占用3個字節,而1個英文字符只占用1個字節。在操作字符串時,我們經常遇到str和bytes的互相轉換。為了避免亂碼問題,應當始終堅持使用UTF-8編碼對str和bytes進行轉換。
python中的內容編碼