Preface
寫過 Python 的人應該都遇過下面這個錯誤吧,這是 Python 2.x 典型的編碼錯誤訊息:
相對於其他程式語言而言,Python 2.x 對於編碼的處理較不易讓新手理解,偏偏處理 CJK 一定得用 Unicode。本文用簡單的範例示範如何在 Python 2.x 處理 Unicode 字串。
在 Python 2.x 處理 Unicode 字串
程式碼內出現非 ascii 字元
Python 2.x 預設的編碼是 ascii,如果程式碼(含註解)內出現中文的話,會在編譯時產生錯誤。在程式碼的檔案開頭加上下面這行就能成功編譯:
- # -*- coding: utf-8 -*-
Python 2.x 中,字串分為「unicode 型態」與「str 型態」兩種,
此時 uni_name 的資料型態是 python 的 「unicode 物件」,並非「str 物件」故當對 uni_name 這個變數做 「str 物件」的操作時會出現錯誤(例如與另一個「str 物件」相加):
我們可以對 uni_name 這個變數做「unicode 物件」操作(例如與另一個「unicode 物件」相加):
Python 2.x 的 encode([encoding]) 與 decode([encoding])
python 有個 method 叫做 encode([encoding_], [errors='strict']) 這個方法可以將「unicode 物件」轉換成以 encoding_ 方式編碼的「str 物件」:
同樣的道理,我們也可以用 decode([encoding_]) 將「str 物件」還原成「unicode 物件」
Python 2.x 字串操作 Unicode code print
pyhton 的 「unicode 物件」除了在操作時不用擔心編碼問題外,也可以直接插入字元的 unicode code print,例如:
在 Python 2.x 處理 Unicode 字串 - 檔案 I/O
1. open(file)
讀取檔案時,預設會以「str 型態」讀進資料:
2. codecs.open(file, encoding)
用 codecs module 讀寫檔案時可指定 encoding,可以「unicode 型態」讀進資料
3. json.load(), json.loads()
當使用 json.loads 讀取 json 資料時,回傳的結果會是「unicode 物件」型態:
在 Python 2.x 處理 Unicode 字串 - 結論
1. type() 看字串型態
當出現亂碼時,用 type() 看看該變數是「unicode 物件」還是「str 物件」,然後用 encode() 或 decode() 將其轉成你要的型態。
2. encode() 與 decode()
*「unicode 物件」透過 encode(encoding) 變成「str 物件」(i.e. a sequence of bytes)
*「str 物件」透過 decode(encoding) 變成「unicode 物件」
* encode() 和 decode() 也能用來轉換其他編碼:
3. I/O 輸入輸出
如同 Unicode In Python, Completely Demystified 建議的,記住三個原則:
並使用 codecs.open(file, encoding)
Supplement
* Python Doc - Unicode HOWTO
沒有留言:
張貼留言