Python2 與 Python3 的編碼對比
在 Python 中,不論是 Python2 還是 Python3 中,總體上說,字符都只有兩大類:
- 通用的 Unicode 字符;
- (unicode 被編碼後的)某種編碼類型的字符,比如 UTF-8,GBK 等類型的字符。
Python2 中字符的類型:
str: 已經編碼後的字節序列
unicode: 編碼前的文本字符
Python3 中字符的類型:
str: 編碼過的 unicode 文本字符
bytes: 編碼前的字節序列
我們可以認為字符串有兩種狀態,即文本狀態和字節(二進制)狀態。Python2 和 Python3 中的兩種字符類型都分別對應這兩種狀態,然後相互之間進行編解碼轉化。編碼就是將字符串轉換成字節碼,涉及到字符串的內部表示;解碼就是將字節碼轉換為字符串,將比特位顯示成字符。
在 Python2 中,str 和 unicode 都有 encode 和 decode 方法。但是不建議對 str 使用 encode,對 unicode 使用 decode, 這是 Python2 設計上的缺陷。Python3 則進行了優化,str 只有一個 encode 方法將字符串轉化為一個字節碼,而且 bytes 也只有一個 decode 方法將字節碼轉化為一個文本字符串。
Python2 的 str 和 unicode 都是 basestring 的子類,所以兩者可以直接進行拼接操作。而 Python3 中的 bytes 和 str 是兩個獨立的類型,兩者不能進行拼接。
Python2 中,普通的,用引號括起來的字符,就是 str;此時字符串的編碼類型,對應著你的 Python 文件本身保存為何種編碼有關,最常見的 Windows 平臺中,默認用的是 GBK。Python3 中,被單引號或雙引號括起來的字符串,就已經是 Unicode 類型的 str 了。
對於 str 為何種編碼,有一些前提:
- Python 文件開始已經聲明對應的編碼
- Python 文件本身的確是使用該編碼保存的
- 兩者的編碼類型要一樣(比如都是 UTF-8 或者都是 GBK 等)
這樣 Python 解析器才能正確的把文本解析為對應編碼的 str。
總體來說,在 Python3 中,字符編碼問題得到了極大的優化,不再像 Python2 那麽頭疼。在 Python3 中,文本總是 Unicode, 由 str 類型進行表示,二進制數據使用 bytes 進行表示,不會將 str 與 bytes 偷偷的混在一起,使得兩者的區別更加明顯。
Python2 與 Python3 的編碼對比