這裡介紹如何設定 Python 指令稿的檔案編碼,讓包含中文字的 Python 程式可以正常執行,不會產生亂碼。

Python 在讀取指令稿並執行時,預設會將檔案以 ASCII 編碼的方式來處理,也就是說如果在 Python 程式碼或是註解當中有包含中文字的話,在執行時就會出錯,以下是解決 Python 中文編碼問題的教學。


這是一個包含中文註解的 Python 指令稿 chinese.py

#!/usr/bin/python

# 中文註解
print("Hello, world.")

如果直接執行:

python chinese.py

會出現類似這樣的錯誤:

  File "chinese.py", line 3
SyntaxError: Non-ASCII character '\xe4' in file chinese.py on line 3, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

不論中文字是出現在程式碼還是註解當中,都會出現這個錯誤,這則錯誤訊息的意思是指我們的 chinese.py 指令稿中包含非 ASCII 的字元。

如果要要讓這種包含中文的 UTF-8 編碼的 Python 指令稿正常執行,需要加上明確的檔案編碼宣告才行,例如:

#!/usr/bin/python
# -*- coding: utf-8 -*-

# 中文註解
print("Hello, world.")

Python 指令稿的編碼宣告必須出寫在程式碼的第一行或第二行,這裡我們在第二行指定檔案編碼格式 UTF-8,這樣就可以正常執行了。

python chinese.py
Hello, world.

Python 指令稿的編碼指定方式相當彈性,事實上它是使用 coding[=:]\s*([-\w.]+) 這一串正規表達式(regular expression)來讀取編碼設定的,所以只要第一行或第二行註解中的內容可以跟這個正規表達式,即可正確設定檔案編碼,以下是常見的幾種設定方式。

這是同時適用於 GNU Emacs 編輯器的編碼設定方式,這樣寫的話當我們使用 Emacs 編輯器開啟這個 Python 指令稿時,Emacs 就會自動以 UTF-8 編碼開啟此檔案:

# -*- coding: utf-8 -*-

這是適用於 Vim 編輯器的寫法:

# vim:fileencoding=utf-8

當然也可以用自己喜歡的格式:

# file encoding: utf-8 (for chinese)

如果在 Windows 中使用 Big5 編碼的話,則將編碼的名稱改為 cp950

# -*- coding: cp950 -*-

其餘以此類推。

參考資料:python.orgPython DocumentationStackOverflow