python2與python3的bytes問題
阿新 • • 發佈:2018-11-07
>>> s = '程式設計' >>> print s 程式設計 >>> s '\xe7\xbc\x96\xe7\xa8\x8b' >>>
在python2中直接呼叫字串的變數的話,會列印其bytes(可以理解成用16進製表示字串的記憶體地址,本質還是二進位制)。在python2中,bytes和str是一回事。
為什麼要有個bytes呢?。因為所有資料本質都是用二進位制進行儲存的,當傳輸資料的時候,要把這些資料先轉換成二進位制( bytes)在進行傳輸。除此之外,python2裡還有個單獨的資料型別,把字串解碼後,就會變成unicode。
>>> s '\xe8\xb7\xaf\xe9\xa3\x9e' #utf-8 >>> s.decode('utf-8') u'\u8def\u98de' #unicode 在unicode編碼表裡對應的位置 >>> print(s.decode('utf-8')) 路飛 #unicode 格式的字元
原因是python2的預設編碼是ASCII,後來為了支援多國語言,就想弄個unicode。但是直接把ASCII轉成unicode是很費勁的,所以龜叔直接搞了一個新的字元型別,就叫unicode,說白了就是你得在記憶體裡先把字串存成unicode型別
2008年python3出世,來了個大變革:
- 把字串的編碼變成了unicode,檔案預設編碼變成了utf-8。
- 把str 和bytes 做了明確區分, str 就是unicode格式的字元, bytes就是單純二進位制
還有一個很重要的是,在python3中,只有unicode給你展示字形,其他的編碼一律用bytes展示,也就是說要你強制使用unicode。
最後再提示一下,Python只要出現各種編碼問題,無非是哪裡的編碼設定出錯了
常見編碼錯誤的原因有:
- Python直譯器的預設編碼
- Python原始檔檔案編碼
- Terminal使用的編碼
- 作業系統的語言設定
參考:https://www.cnblogs.com/alex3714/articles/7550940.html