decode()用错编码会立刻报UnicodeDecodeError;Python3中str是Unicode、bytes是原始字节,二者不可混拼,文件读写必须显式指定encoding,否则跨平台易乱码。

decode() 用错编码会立刻报 UnicodeDecodeError
Python 3 中 str 是 Unicode,bytes 是原始字节。一旦你拿 b'\xe4\xbd\xa0\xe5\xa5\xbd'(UTF-8 编码的“你好”)却用 .decode('gbk'),Python 就会按 GBK 规则去拆分这些 UTF-8 字节——而 UTF-8 的多字节序列在 GBK 下根本不是合法字符,直接抛 UnicodeDecodeError。
常见场景:读取网络响应、解析二进制文件头、处理旧系统导出的 CSV。
- 别猜编码,先查来源:HTTP 响应头有
Content-Type: text/html; charset=gb2312,就该用.decode('gb2312') - 不确定时,用
chardet.detect(b_data)探测,但注意它只是概率估算,不保证 100% 准确 - 临时容错可用
.decode('utf-8', errors='replace'),得到“世界”,比崩溃强;但生产环境应明确修复源头编码
open() 不指定 encoding 参数,Windows 上大概率乱码
Windows 默认编码是 cp936(GBK 的变种),Linux/macOS 默认是 utf-8。如果你写 open('data.txt').read(),Python 就会用系统默认编码去解码文件字节——同一份 UTF-8 文件,在 Windows 上打开就是一堆 æ。
真实踩坑点:脚本在开发机(macOS)跑通,一上服务器(CentOS)或客户机(Windows)就崩。
立即学习“Python免费学习笔记(深入)”;
- 所有文本文件读写必须显式传
encoding:比如open('log.txt', 'r', encoding='utf-8') - 写文件时也一样,
open('out.csv', 'w', encoding='gbk')才能被 Excel 正常打开(中文 Windows 环境) -
errors参数可兜底:encoding='utf-8', errors='ignore'跳过非法字节,适合清洗脏数据
str 和 bytes 混拼会 TypeError,不是乱码而是直接报错
这是新手最容易忽略的类型边界问题:"prefix" + b'\xe4\xbd\xa0' 或 b'head' + "tail" 都会立刻触发 TypeError: can't concat str to bytes。它和乱码无关,是类型系统在阻止你做无意义操作。
典型场景:构造 HTTP 请求体、拼接日志消息、生成协议包。
- 统一转成
str:先b_data.decode('utf-8'),再拼接字符串 - 统一转成
bytes:先s.encode('utf-8'),再用+拼接 - 如果涉及混合内容(如 HTTP header + body),建议全程用
bytes,header 也提前encode()
encode() 时指定错误 encoding 可能静默截断或替换
比如 "你好".encode('ascii') 默认会报 UnicodeEncodeError,但加了 errors='ignore' 就变成空字节串 b'';用 errors='replace' 则变成 b'??'——表面没报错,实际信息已丢失。
这比 decode 报错更危险,因为程序继续跑,但输出不可信。
- 除非你明确要丢弃非 ASCII 字符(比如生成纯英文日志 ID),否则不要轻易用
errors='ignore' - 向外部系统发数据前,务必确认对方支持的编码;比如老短信网关只认
gbk,那就得用.encode('gbk'),不能只图本地测试方便用utf-8 - 对关键业务字段(如用户昵称、订单号),建议在 encode 前加校验:
if not all(ord(c)


















