python2和python3的操蛋編碼問題

2021-08-08 06:41:30 字數 1870 閱讀 6521

0x00 字元的編碼

計算機畢竟是西方國家的發明,最開始並沒有想到會普及到全世界,只用乙個位元組中的7位(ascii)來表示字元對於現在龐大的文字數量來說顯然不夠,所以先後經歷了好幾套編碼方案,不同國家和地區又有自己的方案,造成了現在諸多的歷史遺留問題。具體講述編碼原理請看這篇文章:python編碼的前世今生

0x01 python中的字串

python有兩種不同的字串,一種儲存文字,一種儲存位元組。對於文字,python內部採用unicode儲存,而位元組字串顯示原始位元組序列或者ascii。

什麼叫編碼(encode)?

按照字面意思和以往經驗,我要把這個文字或字串用「utf-8」編碼,感覺上應該是對位元組資料進行編碼然後顯示正確的文字。大多數人都是這麼想的,可事實呢?

編碼的意思是將unicode字元按照編碼規則(如utf-8)編成位元組序列:

這裡寫描述

有人此時會問,我用 print 語句列印出來怎麼是亂碼或者是中文,並不是位元組序列。這是因為你呼叫 print 語句的時候,預設進行了隱式解碼,為的是讓人類看見友好的字元資料 ,也就是預設的進行了str()包裝,想看見背後真正的十六進製制數,你需要呼叫魔術方法 repr() 。

什麼叫解碼(decode)?

對應的,解碼就是將位元組序列按照編碼規則(如utf-8)解釋成unicode形式。

這裡寫描述

這裡或許又會有疑問,編碼解碼都是十六進製制,那中文字元咋顯示的?

這又要結合你的環境了。看完我上面推薦的文章,你就會明白,unicode只是一種標準,而具體的編碼才是實現方式。有了正確的unicode編碼,僅僅代表你有了正確的英文文獻,想翻譯成中文,還得再轉換一次。而這一次轉換,是你的環境幫你完成。舉個例子,你開啟乙個文件,發現是亂碼,多半是文字編輯器的解碼方式有問題,換個解碼規則就好了。

0x02 python2 和 python3 之間的區別

python3 一切都很美好

在python3當中,文字字串型別(使用unicode資料儲存)被命名為 str , 位元組字串型別被命名為 bytes 。一般情況下,例項化乙個字串會得到乙個 str 物件 :

這裡寫描述

所以現在很多人都說,python3預設是unicode,也就是這個意思。

如果你想得到bytes,那就在文字之前加上字首 b , 或者 encode 一下。

這裡寫描述

所以,很顯然,str 物件有乙個encode方法,bytes 物件有乙個decode方法。

python2 相當的操蛋,甚至會誤導你

在python3中的 str 物件在python2中叫做 unicode ,感覺很通俗對吧?但 bytes 物件在python2中叫做 str ,對。。就是你平時用的 str , 預設的那個。。。

如果你想得到乙個文字字串,你需要在字串之前加上字首 u 或者 decode 一下。

搞笑的還不止這麼點,python2中的 str (位元組) 物件,竟然有乙個 encode 方法!!!而且你別指望它有什麼特殊用處,它就是用來報錯的,永遠都別使用它!!!

同樣的,unicode (文字字元) 物件也有乙個用來報錯的 decode 方法。

我們嘗試一下:

這裡寫描述

不知道大家注意到錯誤資訊沒有,我們在進行解碼,規則是gbk,但它說 無法用 ascii 進行編碼 ,這是為什麼?

這就是python2自作聰明為了對乙個unicode物件執行解碼而進行的隱式編碼 ,等於以下**:

b.encode(『ascii』).decode(『gbk』)

1 這就是為什麼很多人說,python2的編碼很操蛋。

0x03 小結

如果你在用2.x,請養成在字串加上 u 字首的習慣,統一編碼utf-8,如果windows控制台或者pycharm控制台依舊出現亂碼,那多半是控制台編碼不同,改過來就好。

python3和python2的區別

1.效能 py3.0執行 pystone benchmark的速度比py2.5慢30 guido認為py3.0有極大的優化空間,在字串和整形操作上可 以取得很好的優化結果。py3.1效能比py2.5慢15 還有很大的提公升空間。2.編碼 py3.x原始碼檔案預設使用utf 8編碼,這就使得以下 是合...

Python2和Python3的比較

python2 python3 print fish print fish unicode 是單獨的 unicode utf 8 字串 b b china byte 和 bytearrays type b type bytes s b.decode 轉化成 string 型別b1 s encode ...

python3和python2的區別

這個星期開始學習python了,因為看的書都是基於python2.x,而且我安裝的是python3.1,所以書上寫的地方好多都不適用於python3.1,特意在google上search了一下3.x和2.x的區別。特此在自己的空間中記錄一下,以備以後查詢方便,也可以分享給想學習python的frie...