python2和python3的編碼問題

2021-10-12 21:38:37 字數 2339 閱讀 1030

每個系統都有自己的預設編碼,比如中國的windows預設gbk,linux預設是utf-8,顯示各種介面化我們能看到的ui,都是使用的系統的編碼。

而unicode是萬國碼,在它的基礎上可以encode成各種別的國家的特有編碼。

unicode.encode = utf8

utf8.decode = unicode

從寫檔案到讀檔案的流程:

py寫入檔案,寫檔案都是二進位製流,所以會先找寫入方法的encoding型別做編碼,如果方法沒有指定就會找py預設的編碼寫入。(py2是ascii,py3是u8)。

寫入後,開啟檔案,如果檔案軟體本身支援編碼選擇的,選擇和文字寫入的編碼一樣就會正常顯示,否則亂碼。如果檔案使用的是系統編碼,那系統的編碼和文字寫入的編碼一樣就會正常顯示,否則亂碼。

在python2中,有unicode和str兩種型別。我們在字串前面加u,它的型別就是unicode,如果去掉u,那型別就是str。python2的str和bytes是乙個東西,所以我們給字串前面加b,其實type出來也是str型別。

讀寫檔案時,如果我們把unicode的資料寫入文字肯定會報錯。因為字串是 unicode,所以python會(自動)先呼叫encode方法來編碼unicode字串,然後再寫入檔案,因為python2的open不能指定encoding型別,就按照預設的python2的編碼ascii碼,unicode->ascii碼是有問題的所以報錯了。

另外,python2的檔案寫入, open檔案型別是不是b都無所謂,因為str和bytes本來就是乙個東西,寫入的都是二進位製流。

總結:python2的編碼有兩種,一種是unicode,另一種是str,而bytes就是str。

utf8,gbk等編碼的型別是str,這樣導致二進位制方式的讀寫和普通方式讀寫沒有區別的。

如果要把unicode型別的字串寫入檔案,要看檔案所在系統的編碼,需要encode才能寫入。否則按照python2預設的ascii編碼就會報錯。

python3裡去掉了unicode這種型別,增加了bytes型別。就是str和bytes兩種型別,原來的unicode其實就是str型別。

我們在此str基礎上encode,變成utf8,它的型別就是bytes。輸出後會看見字串前面有b的標誌,這就是bytes型別。如果強行給b裡寫入漢字會報錯,python3機制是bytes型別只支援固定的ascii碼。

在python3中的檔案讀寫是方便很多,首先在open函式裡加入了encoding引數,可以在讀寫的同時根據本地電腦的編碼對文字編碼做適配。其次因為python3的預設編碼是unicode,就算我們不指定也能按照u8編碼。(這一步在2中是會報錯的)

因為bytes型別的設定,導致有些庫的呼叫我們需要傳入二進位制格式,這時我們要對引數做encode,在python2中因為bytes就是str是不需要處理的。

signature = rsa.sign(message.encode(

"utf-8"

), key,

'sha-256'

)hashlib.md5(message.encode(encoding=

'utf-8'))

.hexdigest(

)

上面轉換為utf8的目的,就是把它的型別轉為方法要求的bytes,我們看看rsa的sign方法引數的定義:

def

sign

(message:

bytes

, priv_key: key.privatekey, hash_method:

str)

->

bytes

:

總結:

python3的編碼型別有str和bytes兩種,unicode型別就是str。utf8這些型別就是bytes。

open函式新增encoding引數,可以對文字的讀寫做編碼轉化,避免亂碼。(不寫也行,就按照預設的u8編碼)

網路傳輸的結果都是bytes,對於bytes的讀寫檔案需要加wb或rb,str型別就是正常檔案的讀寫。

函式傳參要注意是bytes還是str,要對引數做相應的處理。

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...