【【W(wǎng)3Cschool】你覺得python很難,那只是你沒有懂而已!】http://toutiao.com/group/6550931721632612877/?iid=15906422033&app=explore_article×tamp=1525362651&tt_from=copy_link&utm_source=copy_link&utm_medium=toutiao_ios&utm_campaign=client_share
在 Python 尤其是 Python2 中,編碼問題是困擾開發(fā)者尤其初學者的一大問題。什么 Unicode/UTF-8/str,又是 decode/encode 的,搞得人頭都大了。其實不然,看似龐大難懂,但是可以非常精細地定制需求。
0.Python 中的編碼
Python 中有兩個常用的由 basestring 派生出來的表示字符串的類型:str, unicode。其中,str 類似于 C 中的字符數(shù)組或者 Java 中的 byte 數(shù)組,事實上你可以將它理解為一個存儲二進制內(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 字符串。對應的指定編碼后的寫入文件,則可以直接將 unicode 寫到文件中。通過 codecs.open 可以避免很多編碼問題:
建議
對于 Python 代碼中避免遇到編碼問題,有一些小建議:
字符編碼聲明:在代碼開頭聲明編碼格式
使用 codecs 的 open 函數(shù)處理文本文件
盡可能使用 unicode 而不是 str