Python 2.x 中文亂碼是許多開發者的痛點。本文從編碼原理出發,系統梳理亂碼產生的根本原因,提供分場景的完整解決方案,並深入解析編碼/解碼機制。
核心原因在於 默認編碼不匹配:
當源文件編碼、Python 內部處理編碼、終端顯示編碼三者不一致時,就會發生解碼錯誤,產生亂碼。
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
通常不會出現亂碼,無需特殊處理。Python 會自動使用終端編碼。
兩步驟缺一不可:
# coding=utf-8
# 或
# -*- coding: utf-8 -*-
重要:編碼聲明只是告訴解釋器「源碼包含非 ASCII 字符」,實際轉換發生在保存時。聲明與實際保存格式必須一致!
即使源文件正確,輸出時仍需 編碼轉換:
# 核心原則:按源編碼解碼 → 按目標編碼編碼
# 假設源文件是 UTF-8,Windows CMD 是 GBK
# 錯誤做法
print "中文" # 直接輸出 UTF-8 字節到 GBK 終端 → 亂碼
# 正確做法
print u"中文".encode('gbk') # 先解碼為 unicode,再編碼為 GBK
# 或通用寫法
import sys
print u"中文".encode(sys.stdout.encoding or 'gbk')
| 操作 | 方向 | 說明 |
|---|---|---|
decode | bytes → unicode | 將字節流按指定編碼解析為 Unicode 字符串 |
encode | unicode → bytes | 將 Unicode 字符串按指定編碼序列化為字節流 |
鐵律:編碼與解碼必須成對使用,編碼格式必須一致。
str 類型),bytes 為字節類型中國 = 'China'u"..." 或 from __future__ import unicode_literals)sys.stdout.encoding 或 locale.getpreferredencoding()| 現象 | 原因 | 解決 |
|---|---|---|
| SyntaxError: Non-ASCII character | 缺少編碼聲明 | 添加 # -*- coding: utf-8 -*- |
| UnicodeDecodeError: 'ascii' codec can't decode | 隱式解碼使用默認 ASCII | 顯式 .decode('utf-8') |
| 輸出亂碼(如 鏂伴椈) | UTF-8 字節被 GBK 解讀 | .encode('gbk') 輸出 |
| 文件讀取亂碼 | 文件編碼與 open() 指定編碼不符 | open(f, encoding='gbk') 或 codecs.open |
Python 2.x 中文亂碼本質是 編碼鏈路不一致。解決之道在於:源文件 UTF-8 保存 + 內部 Unicode 處理 + 輸出時按目標編碼序列化。理解這一原理,亂碼問題迎刃而解。強烈建議新項目遷移至 Python 3,從根源消除編碼困擾。