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 - 字典介紹。

參考資料

上一頁 單元 35 - 格式化字串
回 Python 簡易手冊 首頁
下一頁 單元 37 - 二進制序列
回 Python 教材首頁
回程式語言教材首頁