
在 Python 尤其是 Python2 中,編碼問題是困擾開發(fā)者尤其初學(xué)者的一大問題。什么 Unicode/UTF-8/str,又是 decode/encode 的,搞得人頭都大了。其實(shí)不然,看似龐大難懂,但是可以非常精細(xì)地定制需求。學(xué)習(xí)資料也可以加下Python扣扣裙:四八三五四六四一六自己下載學(xué)習(xí)下
0.Python 中的編碼
Python 中有兩個常用的由 basestring 派生出來的表示字符串的類型:str, unicode。其中,str 類似于 C 中的字符數(shù)組或者 Java 中的 byte 數(shù)組,事實(shí)上你可以將它理解為一個存儲二進(jìn)制內(nèi)容的容器,str 不存儲編碼信息,果對 str 類型的字符串迭代的話,則會按照其在內(nèi)存中的字節(jié)序依次迭代,意味著如果這個字符串存儲的是多字節(jié)字符(Unicode/GBK等),則會截斷這個字符,演示如下:

而對于 unicode 類型,Python 在內(nèi)存中存儲和使用的時候是按照 UTF-8 格式,在代碼中的表示為字符串前加 u,如:

而 unicode 與 str 之間的轉(zhuǎn)換,則用到了 encode 和 deocde 方法。decode 表示將一個 (str) 字符串按照給定的編碼解析為 unicode 類型,encode 則表示將一個 unicode 字符串按照指定編碼解析為字節(jié)數(shù)組 (str):

1.文件讀寫

內(nèi)置的 open 函數(shù)打開文件時,read 方法讀取的是一個 str (私以為叫做字節(jié)數(shù)組更合適),如果讀取的是其它編碼的文字,則需要 decode 之后再做使用。

對于使用 open 函數(shù)打開文件之后的寫操作,則需要將需要寫入的字符串按照其編碼 encode 為一個 str ,如果直接寫入,則會引發(fā)如下錯誤:

除此以外,codecs 模塊也提供了一個 open 函數(shù),可以直接指定好編碼打開一個文本文件,那么讀取到的文件內(nèi)容則直接是一個 unicode 字符串。對應(yīng)的指定編碼后的寫入文件,則可以直接將 unicode 寫到文件中。通過 codecs.open 可以避免很多編碼問題:


建議
對于 Python 代碼中避免遇到編碼問題,有一些小建議:
字符編碼聲明:在代碼開頭聲明編碼格式
使用 codecs 的 open 函數(shù)處理文本文件
盡可能使用 unicode 而不是 str