python字符串编码错误本质是unicode与字节转换不匹配,需明确编/解码编码;unicodeencodeerror是str→bytes失败,unicodedecodeerror是bytes→str失败;读文件先用chardet探测编码再指定,写文件和http请求优先utf-8,json输出设ensure_ascii=false,终端乱码需统一环境编码。

Python字符串编码错误本质是Unicode字符串和字节序列之间转换不匹配,核心在于“该用什么编码解、该用什么编码编”。只要理清数据来源和目标环境,问题基本能定位清楚。
先看报错类型,分清是“编不出”还是“解不开”
两种异常对应两类操作:
-
UnicodeEncodeError:字符串(str)→ 字节(bytes)失败。比如
"中文".encode('ascii')—— ASCII 压根不认中文,直接报错。 -
UnicodeDecodeError:字节(bytes)→ 字符串(str)失败。比如用
open('file.txt').read()读一个GBK文件,Python 默认按UTF-8去解,字节对不上就崩溃。
读文件时乱码或报错?先查实际编码再指定
别猜,用 chardet 探测:
- 安装:
pip install chardet - 检测示例:
import chardet with open('data.txt', 'rb') as f: raw = f.read() print(chardet.detect(raw)['encoding']) # 输出类似 'gbk' 或 'utf-8-sig' - 读取时显式传参:
with open('data.txt', 'r', encoding='gbk') as f:
写文件或发请求前,统一用UTF-8编码
除非对接老旧系统(如某些Windows本地工具),否则优先选UTF-8:
立即学习“Python免费学习笔记(深入)”;
- 写文件:
with open('out.txt', 'w', encoding='utf-8') as f: - HTTP请求(requests):
r = requests.get(url); r.encoding = 'utf-8'; text = r.text - JSON输出避免\u4f60\u597d:
json.dumps(data, ensure_ascii=False)
终端/IDE显示乱码?不是代码问题,是环境没配对
代码里字符串是对的,但终端用GBK解UTF-8字节,自然成“锟斤拷”:
- Windows命令行:运行
chcp 65001切到UTF-8模式 - VS Code:检查设置中
files.encoding是否为utf8 - Linux/macOS:确认
locale输出含UTF-8,例如LANG=en_US.UTF-8










