這是一篇我發表在 Python.cn 郵件列表上,如今放在Blog做一個記錄,略做整理。 如何處理unicode及其它的編碼,其實這個問題想明白了很簡單: 字符串有不少的編碼 不一樣的系統和平臺有各自的編碼 爲了實現系統或平臺之間的信息交互可能須要編碼轉換 基本上在兩個處理環節上進行轉換:你的系統從其它系統讀 你的系統從其它系統寫 根據須要進行從源頭到目標系統的編碼轉換 那麼常見的環節都有哪些呢,我只能從經驗上來回答了?如 NewEdit 使用 wxPython 的unicode版本,那麼首先要明白,全部wxPython自帶的函數和類都是使用unicode的,哪怕是打開文件對話框這樣的從外部輸入的類也會自動將文件名轉爲unicode。而後可能的環節有: 使用python的自帶模塊操做文件系統,如:file()和操做目錄等 使用socket發送和接收數據 總之是調用非wxPython的東西均可能須要編碼轉換 再如XML的處理也是常常有人問的。你應該要記住,當一個XML報文從文件被解析成DOM樹時,全部的文本信息都被處理爲unicode。而後再考慮與外部環境的交互,看一看是否須要進行編碼轉換。 在明白有可有須要進行編碼轉換的地方後,再考查到底需不須要進行編碼轉換。當調用的內容與你的系統編碼一致時,並不須要轉換。那麼對方系統到底要什麼樣的編碼呢,那隻能仔細看文檔,靠你的經驗,靠你多作測試。並且根據python所報出來的錯誤通常也能夠判斷出來。那麼當發現須要編碼轉換時,剩下的就是如何正確進行碼制轉換。 再舉例說明,如你的系統爲unicode編碼。那麼數據有兩個流向,一種是調用各類內部或外部的方法來獲得數據,這就是讀操做。若是是調用系統內的函數,如調用wxPython自已的函數,你能夠認爲它返回的都是unicode,這樣你的系統也爲unicode,所以不須要轉換。但若是調用的函數返回非unicode,通常須要轉換。爲何說通常呢?由於若是返回的是英文串的話,不轉換也不會出來,但對於包含中文的狀況是會出錯的。另外一種流向是把系統中的數據傳入一個方法中進行處理,這就是寫的操做。若是調用的是系統內部的方法,如調用wxPython的方法,你能夠認爲這個方法須要unicode編碼,而數據又是系統中的,所以編碼都是unicode,不須要轉換。但若是你調用的方法要求其它的編碼時,通常須要進行編碼轉換。對於亞洲語言是特別要考慮這個問題。 常見的編碼轉換分爲如下幾種狀況: unicode->其它編碼 例如:a爲unicode編碼 要轉爲gb2312。a.encode(‘gb2312′) 其它編碼->unicode 例如:a爲gb2312編碼,要轉爲unicode. unicode(a, ‘gb2312′)或a.decode(‘gb2312′) 編碼1 -> 編碼2 能夠先轉爲unicode再轉爲編碼2 如gb2312轉big5 unicode(a, ‘gb2312′).encode(‘big5′) 判斷字符串的編碼 isinstance(s, str) 用來判斷是否爲通常字符串 isinstance(s, unicode) 用來判斷是否爲unicode 若是一個字符串已是unicode了,再執行unicode轉換有時會出錯(並不都出錯) 能夠寫一個通用的轉成unicode函數: def u(s, encoding): if isinstance(s, unicode): return s else: return unicode(s, encoding) 那麼unicode與utf-8,utf-16有什麼區別呢。我認爲unicode能夠稱爲抽象編碼,也就是它只是一種內部表示,通常不能直接保存。保存到磁盤上時,須要把它轉換爲對應的編碼,如utf-8和utf-16。 除上以上的編碼方法,在讀寫文件時還可使用codecs的open方法在讀寫時進行轉換。 另外我之前寫過幾篇blog有這方面的介紹: [Python學習]在程序中簡單地定義unicode漢字 [wxPython學習]unicode文本寫入文件的處理 [Python學習]再談文件編碼的處理 使用locale判斷本地語言及編碼 同時在linuxforum.net上的python版有關於unicode的討論,能夠找一下。 網上也有很多的資料能夠查閱。 但願本文對你有幫助。