python 2.x的編碼問題

我發現很多剛剛接觸Python的同行在python版本的選擇上比較頭疼,python3是未來的確是毋庸置疑,但是現實是缺乏很多強大的第三方庫;2.x系列呢,又有很多人糾結編碼問題,其實到了2.7的年代,python在編碼以及平滑向3過渡的問題已經做了大量工作了。

我就基於python 2.7簡單說說編碼的事情,讓更多人可以完全不用擔心python的編碼問題,放心大膽的使用當前的主流版本,並且將來還可以輕鬆過渡到python 3.x。

----------------------

首先,講講str和unicode這兩個對象。

str:其底層存儲的字節跟輸入有關,如果終端輸入的是gbk編碼的'中國',那麼str裏面保存的字節序列是'\xd6\xd0\xb9\xfa',如果輸入編碼是utf8,那麼字節序列爲'\xe4\xb8\xad\xe5\x9b\xbd'。而如果在終端用gbk編碼顯示字節序列爲utf8編碼的'中國',當然會亂碼了。所以要搞定這種問題,首先要知道str裏面的字節序列是什麼編碼的,找輸入的源頭吧。

unicode:其與str不同在只要你能正確生成unicode對象,那麼此對象保存的東西永遠是unicode編碼,跟輸入時的編碼無關,你也不用知道其底層使用的是什麼字節序列,只需要知道取出來的時候是unicode對象,要轉成其他編碼的字節序列的話encode一下就行了,例如,我有一個保存着"中國"二字的u,你要輸出到gbk終端,那麼可以u.encode('gbk'),這樣就生成了一個gbk編碼的字節序列。

僅此而已,搞清編碼問題就是這麼簡單。

 

然後,來說說實際操作。

因爲未來的python是全unicode的,所以在2.7中我們也最好把所有輸入的字符串都生成爲unicode對象,然後再進行各種操作。爲了省事,以及完全忽略str和unicode的不同,可以在代碼開始之前加上這句

from __future__ import unicode_literals

(想知道__future__是什麼東西,可以自己看看python v2.7.2 doc的27.11節)

加上這句之後,'中國'和u'中國'一樣,都是生成了unicode對象,在這種情況下,除非接收第三方庫的輸入或者使用str(),基本很難見到非unicode的字符串了。如此,你就不用再分心字符串到底是哪種對象的問題了,也不用寫滿篇的u'xxx'。

需要注意的就是,在使用某些詭異的較古老的第三方庫,尤其是基於C的庫時,注意要把unicode對象轉成適當編碼的str對象,因爲這些庫對特定編碼的字節序列有依賴。

 

實際上,我本人的python代碼都會在頭部寫上

from __future__ import print_function, unicode_literals, division 
from future_builtins import *

如此寫出來的代碼,跟python 3基本沒什麼區別,到時候過渡過去非常輕鬆。

 

希望大家在python生涯中輕鬆愉快。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章