瞭解python編碼python
資料來源:linux
https://www.tr0y.wang/2018/09/13/py-coding-type/windows
各字符編碼功能介紹 python3.x
ASCII碼主要是爲了處理英文字符編輯器
GB2312主要是處理中文字符性能
unicode主要是爲了處理各國字符編碼
UTF-8提升了unicode存儲和傳輸性能,它是unicode的一種表現形式spa
創造str和unicodeunix
直接創造str和unicodecode
str => unicode,unicode => str
python提供了 decode/encode 用於二者的轉換
1)str -> decode('某種編碼') -> unicode
2) unicode -> encode('某種編碼') -> str
總結:unicode通過編碼後造成str,str編碼後造成unicode
注:unicode是一種字符集,不屬於編碼,其它編碼是具體實現unicode思想的一種編碼,因此str到unicode的轉換稱爲解碼,而unicode到str的轉換稱爲編碼
環境編碼
系統默認編碼 1)linux,unix:utf-8 2)windows:gbk2312
編輯器編碼
能夠自由設置,最好統一爲UTF-8
文件頭部編碼聲明
聲明編碼方式爲:# -*- coding: utf-8 -*- 或 #coding=utf-8(今天才知,-*-僅僅是爲了好看),utf-八、utf8,python都能識別
注:聲明放在第一行,代碼中直接聲明的字符串編碼類型,與頭部聲明編碼方式直接相關,爲避免亂碼和後續處理,建議統一爲utf-8
編碼之間的轉換
須要用unicode搭橋。str有各類編碼的區別,unicode是沒有編碼的標準形式
python2.x和python3.x的編碼方式
python2.x默認使用ascii編碼,python3.x默認使用utf-8編碼,
python2中,str編碼後的結果是bytes,str = bytes, 因此s只能decode
python3.x的編碼方式是:
文本老是 Unicode,由 str 類型表示,二進制數據則由 bytes 類型表示。Python 3 不會以任意隱式的方式混用 str 和 bytes
解釋:首先,Unicode 是內存編碼表示方案(是規範),而 UTF 是如何保存和傳輸 Unicode 的方案(是實現)。 這也是 UTF 與 Unicode 的區別。py3.X 中只有一種能保存文本信息的數據類型:str,不可變,保存的是 Unicode 碼位。Unicode 是離用戶更近的數據,bytes 是離計算機更近的數據
變化: str 表示的概念都是字符串類型,只不過 Py2.x 的 str 是通過編碼的 unicode,而 py3.x 的 str 就是 unicode。 那麼,py3.x 的 unicode 通過編碼後,是什麼呢?就是 bytes。也就是說,py3.x 的字符串默認是 unicode,至於你想把它怎麼編碼(utf8 或者 gbk),都是你本身的事。
#python2.x #python3.x 字符串:str類型 字符串:unicode 類型 type("123") :str type("123"): str len("我"):3 len("我"):1 len("我".decode("utf-8")) : 1 len("我".encode()) : 3
python3.x編碼示例
a = "我" # a 是一個 字符串,類型是 str,用 unicode 表達 print(a) # '我'
a = b'\xe6\x88\x91' # a 是一個 字節流,類型是 bytes,用 utf8 編碼的 unicode 表達 print(a) # b'\xe6\x88\x91' a = "我".encode("utf8") # 將 a 編碼,轉爲用 utf8 編碼的 unicode 表達 print(a) # b'\xe6\x88\x91' a = b'\xe6\x88\x91'.decode("utf8") # 將 a 解碼,轉爲用 unicode 表達 print(a) # "我" a = "我".decode("utf8") # 試圖將 unicode 解碼 # 報錯:AttributeError: 'str' object has no attribute 'decode' a = b'\xe6\x88\x91'.encode("utf8") # 試圖將 bytes 編碼 # 報錯:AttributeError: 'bytes' object has no attribute 'encode' a = b'\xe6\x88\x91'.decode("gbk") # 解碼的編碼類型與原有編碼類型不匹配 # 報錯:UnicodeDecodeError: 'gbk' codec can't decode byte 0x91 in position 2: incomplete multibyte sequence