什么是 str 和 bytes?
在 Python 3 中,str 表示 Unicode 字符串,而 bytes 表示原始的 8 位字节序列。两者不能直接互换,必须通过编码(encode)或解码(decode)进行转换。
使用 encode() 将 str 转为 bytes
最常用的方法是调用字符串的 .encode() 方法:
s = "你好,世界!"
b = s.encode('utf-8')
print(b) # 输出: b'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8c\xe4\xb8\x96\xe7\x95\x8c\xef\xbc\x81'
print(type(b)) # <class 'bytes'>
常见编码格式
- UTF-8:最通用的 Unicode 编码,兼容 ASCII,推荐默认使用。
- ASCII:仅支持英文字符,遇到非 ASCII 字符会报错。
- GBK / GB2312:中文 Windows 系统常用编码。
示例:不同编码的结果不同
text = "Python"
print(text.encode('utf-8')) # b'Python'
print(text.encode('ascii')) # b'Python'
print(text.encode('utf-16')) # b'\xff\xfeP\x00y\x00t\x00h\x00o\x00n\x00'
错误处理
当字符串包含无法用指定编码表示的字符时,会抛出 UnicodeEncodeError。可通过 errors 参数处理:
s = "café"
# 忽略无法编码的字符
print(s.encode('ascii', errors='ignore')) # b'caf'
# 替换为 ?
print(s.encode('ascii', errors='replace')) # b'caf?'
# 使用 XML 字符引用(仅部分编码支持)
print(s.encode('ascii', errors='xmlcharrefreplace')) # b'café'
反向操作:bytes 转 str
使用 .decode() 方法将 bytes 转回字符串:
b = b'\xe4\xbd\xa0\xe5\xa5\xbd'
s = b.decode('utf-8')
print(s) # 输出: 你好
实际应用场景
- 写入二进制文件(如图片、音频)前需将文本转为 bytes。
- 网络传输(如 HTTP、Socket)通常要求发送 bytes 数据。
- 加密、哈希等操作通常以 bytes 为输入。