1. 程式人生 > >python2.X編碼問題梳理

python2.X編碼問題梳理

首先這些問題只有在python2.X版本出現,因為3.X版本中python環境就只有unicode型別的字串了,即所有程式中處理的都會自動轉換成unicode字串。那麼2.X的python程式開發中如何避免和理清編碼問題呢?首先要保持一個良好的統一規則,不然一切都是白扯了,統一都用utf-8是最好的。

python中會用到編碼的不同地方有:

1、python原始檔的編碼
2、python執行時環境的編碼
3、python程式接收的外部輸入字串的編碼


首先,原始檔中的編碼就是對檔案中非英文字元的編碼和儲存方式,預設是用作業系統的預設編碼;這個編碼是由系統的locale決定的【通過systeminfo.exe可以查到】,如:locale設定為zh-CN,那麼其預設編碼就是ASCII碼【locale.getdefaultlocale()】,所以此時原始檔中有非英文字元時就會編碼報錯,解決辦法是在原始碼檔案頭部加一行編碼指定,如:# -*- coding: utf-8 -*-,這樣就是指定了原始檔中非英文字元的編碼方式。

其次
,執行時環境的編碼,通過python在執行時首先獲取系統locale的資訊【locale.getdefaultlocale()】,如:zh-CN的預設編碼是ASCII碼,對於英文字元解碼都正常,當遇到多位元組文字,就會用檔案系統的預設編碼【sys.getdefaultencoding()】,zh-CN時是GBK。這就是我們通常在windows系統的命令列環境中啟動python的效果,所有輸入的字串都是str型別,英文的是ascii型別,中文的則是gbk型別。同樣在python中有一個unicode函式,其在解碼字串時使用的就是前面所說的一套邏輯。再來說說如何在python環境中設定編碼,首先直接設定unicode字元,比如:u'中文',這樣就是直接把一個字串轉換成unicode字串,任何編碼環境下輸入這樣的字串其都會相應的被解碼成unicode字串;還有就是設定python執行環境編碼【sys.getdefaultencoding()】,zh-CN中預設是GBK,不過我們可以修改它,這樣python環境中預設的解碼方式都會使用這個設定的編碼,如:
import sys 
reload(sys)# Python2.5 初始化後會刪除 sys.setdefaultencoding 這個方法,我們需要重新載入 
sys.setdefaultencoding('utf-8')

再次,外部輸入的編碼,比如讀取檔案;內建的open()方法開啟檔案時,read()讀取的是str,讀取後需要使用正確的編碼格式進行decode()。 write()寫入時,如果引數是unicode,則需要使用你希望寫入的編碼進行encode(),如果是其他編碼格式的str,則需要先用該str的編碼進行decode(),轉成unicode後再使用寫入的編碼進行encode()。如果直接將unicode作為引數傳入write()方法,Python將先使用原始碼檔案宣告的字元編碼進行編碼然後寫入。

總結基本上這3個環節上都使用了統一的編碼,那自然就沒有什麼大問題,而上面的3個環節中前2個我們可以控制,第三個是和使用者有關的,不可確定但是我們可以在接收使用者或者外部輸入時就對其進行編碼識別,並在接收字元的同時第一時間就將其解碼為unicode,這樣就可以儘量減少編碼問題的出現了。

if s.decode('utf-8', REPLACE)==s.decode('utf-8', IGNORE):
    s = s.decode('utf-8')
elseif ....
    ....