目次
1. 前言
Python 是一種功能強大的程式語言,在文字處理方面表現優異,並被廣泛應用於全球。然而,在使用 Python 處理日文或其他多語系文字時,選擇正確的文字編碼方式非常重要。特別是 UTF-8 編碼,由於支援多語言(包含日文),能有效降低亂碼發生的風險。 本指南將介紹如何在 Python 中正確使用 UTF-8 編碼,並提供防止亂碼的實用方法。從編碼與解碼的基本概念,到檔案操作的設定方式,以及在 Windows 環境下的注意事項與常見錯誤的處理方式,皆會一一說明,幫助您實際應用於開發中。2. Python 中的文字編碼基礎
文字編碼的基礎知識
文字編碼是將文字轉換為電腦可識別的資料格式的一種機制。例如,「あ」這個字在 UTF-8 中會被編碼為 3 個位元組,並以二進位資料的形式表示。在 Python 中,會使用str
(字串)與 bytes
(位元組序列)這兩種資料型別進行編碼與解碼的操作。在 Python 中進行編碼與解碼
在 Python 中,可以使用encode()
方法將字串進行編碼,反之,使用 decode()
方法可將位元組序列解碼為字串。這使得我們能夠在文字資料與位元資料之間進行相互轉換。編碼範例
以下範例會將字串以 UTF-8 編碼,並以位元組形式顯示:text = "PythonでUTF-8を使う"
encoded_text = text.encode("utf-8")
print(encoded_text)
# 輸出: b'Pythonã§UTF-8ã使ã'
解碼範例
接下來是將 UTF-8 編碼的位元組序列還原為原始字串的方式:decoded_text = encoded_text.decode("utf-8")
print(decoded_text)
# 輸出: PythonでUTF-8を使う
透過理解字串與位元組之間的轉換機制,我們便能正確處理編碼問題。
3. 在 Python 中使用 UTF-8 的方法
操作檔案時指定 UTF-8 編碼
在 Python 中操作檔案時,建議明確指定使用 UTF-8 編碼。如果未指定編碼,將會使用作業系統的預設編碼(依平台而異),這可能導致亂碼問題。寫入檔案的範例
with open("sample.txt", "w", encoding="utf-8") as f:
f.write("こんにちは、Python!")
讀取檔案的範例
with open("sample.txt", "r", encoding="utf-8") as f:
content = f.read()
print(content)
# 輸出: こんにちは、Python!
透過在檔案操作中明確指定 UTF-8,即可避免處理包含日文等多語言文字時發生亂碼。未指定編碼時的風險
如果未指定編碼,Python 將使用系統預設的編碼方式。特別是在 Windows 環境中,通常會使用 Shift_JIS 編碼,這可能導致亂碼發生。因此,建議在進行檔案操作時,養成習慣性地加上encoding="utf-8"
的寫法。4. 在 Windows 環境下的注意事項
在 Windows 系統中,預設編碼通常為 Shift_JIS。如果未明確指定 UTF-8 編碼,在處理包含日文的資料時可能會發生亂碼。以下將介紹如何透過啟用 UTF-8 模式(PEP 540)或設定環境變數來解決此問題。設定 PYTHONUTF8 環境變數
為了讓 Python 在 Windows 環境中預設使用 UTF-8 編碼,可以將PYTHONUTF8
環境變數設為「1」。設定後,Python 的所有檔案操作將自動使用 UTF-8 編碼。環境變數的設定方式
- 開啟環境變數設定畫面 從「編輯環境變數」畫面中新增一個變數。
- 新增變數 變數名稱設為「PYTHONUTF8」,變數值設為「1」。
5. 在 Python 3 中變更預設編碼方式
從 Python 3.7 開始,可以透過-X utf8
指令列選項或 PYTHONUTF8
環境變數啟用 UTF-8 模式。啟用後,Python 將不再依賴系統的預設編碼,而是一律使用 UTF-8。透過指令列參數啟用 UTF-8 模式
python -X utf8 my_script.py
使用這個指令可以讓 Python 強制採用 UTF-8 編碼,進而避免在不同平台間出現的亂碼問題。
6. 亂碼的成因與對應方式
常見的亂碼原因
- 編碼不一致
- 當檔案實際使用的編碼與 Python 指定的編碼不同時,就容易發生亂碼。
- 編碼/解碼時的錯誤
- 如果將使用非 UTF-8 編碼的資料,當作 UTF-8 解碼,就會發生錯誤。
處理編碼錯誤的方法
使用 errors="ignore"
或 errors="replace"
進行錯誤處理
# 忽略編碼錯誤
decoded_text = encoded_text.decode("utf-8", errors="ignore")
# 以替代字元處理錯誤
decoded_text = encoded_text.decode("utf-8", errors="replace")
透過 ignore
選項可以略過有問題的字元,replace
則會用替代字元(如「�」)來顯示,從而避免亂碼導致程式錯誤。