Python 簡易手冊
單元 36 - Unicode
Python 3 從程式檔案編碼到字串 (string) 都預設為 Unicode ,因此直接寫 Python 程式預設都是處理 Unicode 編碼,利用內建函數 (built-in function) ord() 可以取得 Unicode 編碼值,另一個內建函數 chr() 則可以將 Unicode 編碼轉換回字串,例如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # 印出 Unicode 值 print(ord("あ")) print(ord("A")) print(ord("啊")) # 將 Unicode 值轉換成字元 print(chr(ord("あ"))) print(chr(ord("A"))) print(chr(ord("啊"))) # 檔名: unicode_demo.py # 說明: 《Python簡易手冊》的範例 # 網址: http://kaiching.org # 作者: Kaiching Chang # 時間: 2024 年 3 月 |
這個例子分別印出 "あ" 、 "A" 及 "啊" 的 Unicode 值,執行結果如下
> python unicode_demo.py |
12354 65 21834 あ A 啊 |
> |
但是很多檔案或網路文件不見得是 Unicode 編碼,這時候讀取這些檔案或文件就需要先解碼,例如有以下 Big5 編碼的檔案
由於不是 Unicode 編碼,所以程式中處理要先解碼,例如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # 檔案處理 try: with open("demo3.txt", 'rb+') as f: # 讀取檔案 c = f.read() # 將檔案內容以 big5 解碼 t = c.decode("big5", "strict") # 印出檔案內容 print(t) except: # 如果出錯 print("something wrong") # 檔名: unicode_demo2.py # 說明: 《Python簡易手冊》的範例 # 網址: http://kaiching.org # 作者: Kaiching Chang # 時間: 2024 年 3 月 |
這個例子用到例外處理 (exception handling) 跟開啟檔案,單元 26 - try 陳述詳細介紹 try 的使用方式,至於檔案處理的 with 在單元 28 - with 陳述介紹。
由於 demo.txt 是 Big5 編碼,所以第 7 行在讀取檔案後,解碼方法 (method) decode() 的第一個引數 (argument) 用 "big5"
6 7 | # 將檔案內容以 big5 解碼 t = c.decode("big5", "strict") |
如果沒有解碼就就直接印出變數 (variable) c 會印出 bytes 型態的二進制序列 (binary sequence) ,反之解碼後就可以正常印出檔案內容,執行結果如下
> python unicode_demo2.py |
三隻小豬 青蛙王子 貓與老鼠 |
> |
單元 37 - 二進制序列會介紹二進制序列。
如果不知道來源檔案的編碼就需要先檢查編碼,這可以借助第三方工具 chardet ,例如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # 引入 chardet import chardet # 開啟檔案 with open("demo3.txt", "rb") as f: c = f.read() # 檢測檔案編碼 e = chardet.detect(c)["encoding"] print(e) print() # 依檔案編碼進行解碼 temp = c.decode(e) print(temp) # 檔名: unicode_demo3.py # 說明: 《Python簡易手冊》的範例 # 網址: http://kaiching.org # 作者: Kaiching Chang # 時間: 2024 年 3 月 |
chardet 可以用 pip 指令安裝,如何安裝請參考 https://pypi.org/project/chardet/ ,單元 71 - 安裝第三方模組會進一步介紹 pip 指令的使用方式。
此例同樣處理 demo3.txt ,第 8 行利用 detect() 檢測檔案編碼
7 8 | # 檢測檔案編碼 e = chardet.detect(c)["encoding"] |
第 12 行依據檢測到的編碼格式進行解碼,執行結果如下
> python unicode_demo3.py |
Big5 三隻小豬 青蛙王子 貓與老鼠 |
> |
這裡由於 dectect() 回傳的是字典 (dictionary) ,所以用取得的 key 為 "encoding" 才是編碼格式字串,字典會在單元 41 - 字典介紹。