一、编码基础概念
🚀什么是编码?
计算机只识别二进制数据(0 和 1),而人类使用的是字符(如汉字、字母)。编码是将字符(如字母、数字、符号)转换为计算机可存储和传输的二进制数据的过程,解码则是相反的过程。
二、Python 中的编码基础(Python 3)
字符串(str):默认是 Unicode 字符串(存储字符,如 "你好")。
字节串(bytes):二进制数据(存储编码后的字节,如 b'\xe4\xbd\xa0\xe5\xa5\xbd')。
默认编码:Python 3 默认使用 UTF-8 作为字符串的编码方式(但文件操作需显式指定)。
📌 重要提示:Python 2 有 str(字节)和 unicode 类型,但 Python 3 统一为 str(Unicode)和 bytes,避免了历史混乱。
2.1 常见编码标准
ASCII:最早的标准,仅支持128个字符(英文字母、数字、标点)
Latin-1 (ISO-8859-1):扩展了ASCII,支持西欧语言
UTF-8:变长编码,兼容ASCII,支持所有Unicode字符(最常用)
UTF-16:定长或变长编码,用于某些系统和语言
GBK/GB2312:中文编码标准
Shift-JIS:日文编码标准
2.2 str 与 bytes 的区分
Python 3 最重要的改进之一是明确区分文本(str)和二进制数据(bytes):
① 文本字符串(str) - 存储Unicode字符text = "你好,世界!"print(type(text)) # <class 'str'>② 字节序列(bytes) - 存储二进制数据binary = b"Hello, World!"print(type(binary)) # <class 'bytes'>
2.3 默认编码
Python 3 源码默认使用 UTF-8 编码,字符串在内存中以 Unicode 形式存储。
① 检查系统默认编码import sysprint(sys.getdefaultencoding()) # 通常输出 'utf-8'② 文件系统编码print(sys.getfilesystemencoding())
三、编码转换操作
3.1 字符串编码(str → bytes)
使用 encode() 方法将字符串转换为字节串:
text = "你好" # Unicode 字符串encoded_bytes = text.encode('utf-8') # 编码为 UTF-8 字节print(encoded_bytes) # 输出: b'\xe4\xbd\xa0\xe5\xa5\xbd'
3.2 字节解码(bytes → str)
使用 decode() 方法将字节串解码为字符串:
encoded_bytes = b'\xe4\xbd\xa0\xe5\xa5\xbd'decoded_text = encoded_bytes.decode('utf-8') # 用 UTF-8 解码print(decoded_text) # 输出: 你好
3.3 文件读写:必须指定编码!
① 写入文件(指定 UTF-8)with open('example.txt', 'w', encoding='utf-8') as f: f.write("你好,Python!")② 读取文件(必须匹配写入编码)with open('example.txt', 'r', encoding='utf-8') as f: content = f.read()print(content) # 输出: 你好,Python!
⚠️ 常见错误:省略 encoding='utf-8' → 用系统默认编码(如 Windows 默认 cp936),导致中文乱码。
四、常见问题与解决方案
4.1. UnicodeDecodeError: 'utf-8' codec can't decode byte...
🔍原因:用 UTF-8 解码了非 UTF-8 数据(如用 GBK 编码的文件)。
💡解决:
# 尝试用 GBK 解码(假设文件是 GBK 编码)withopen('wrong_encoding.txt', 'r', encoding='gbk') as f: content = f.read()
4.2. UnicodeEncodeError: 'ascii' codec can't encode character...
🔍原因:默认 ASCII 编码无法处理非 ASCII 字符(如中文)。
💡解决:显式指定 UTF-8:
text = "你好"text.encode('utf-8') # 正确# text.encode() # 错误!默认 ASCII 会报错
4.3. 处理错误的编码(errors 参数)
# 用 'replace' 忽略错误字符(替换为 '?')b'\xe4'.decode('utf-8', errors='replace') # 输出: '?'
4.4 统一使用 UTF-8
源代码文件保存为 UTF-8
内部处理统一使用 UTF-8
文件读写默认使用 UTF-8
五、最佳实践:避免编码陷阱
文件操作必须指定编码:open(..., encoding='utf-8')。
网络传输统一用 UTF-8:HTTP 头、JSON 数据默认 UTF-8。
避免使用默认编码:Python 3 的 open() 默认编码是系统相关(如 Linux 为 UTF-8,Windows 为 cp936),显式指定更安全。
检查输入源:如果从外部获取数据(如数据库、API),先确认编码方式。