问题历史:
数据的编码(encoding)和解码(decoding)随着设备、程序和平台之间需要交换信息而变得重要,这些设备、程序和平台可能以不同的方式解释字符及其在内存中的表示。在Python中,这个问题变得更加突出,因为从Python 3.x开始,字符串(str)和字节(bytes)之间有严格的分隔,其中字符串是Unicode字符的序列,而字节是字节的序列。
问题:
在与文件、网络和外部系统打交道时,通常需要在字节表示和字符串之间进行转换。不正确的编码使用可能会导致UnicodeEncodeError和UnicodeDecodeError错误、数据完整性问题和不同语言支持上的问题。
解决方案:
在Python中,可以使用.encode()方法将字符串编码为字节,而要转换回去则使用.decode()。最常用的编码是"utf-8":
text = "你好,世界!" encoded = text.encode('utf-8') # 将字符串编码为bytes print(encoded) # b'\xe4\xb8\x8d...' decoded = encoded.decode('utf-8') # 解码回字符串 print(decoded) # '你好,世界!'
关键特点:
open(..., encoding='utf-8'))。如果尝试使用错误的编码解码字节字符串会发生什么?
尝试使用错误的编码解码字节时,会出现错误或得到错误的字符串。例如:
b = b'\xe4\xb8\x8d\xe5\xa5\xbd' wrong = b.decode('latin-1') print(wrong) # 输出乱码,而不是"你好"
可以通过 + 直接连接字符串和字节字符串吗?
不可以。这会引发TypeError异常。
s = "abc" b = b"def" # s + b # TypeError: can only concatenate str (not "bytes") to str
可以在不明确指定编码的情况下写入文本文件吗?
可以,但这被视为不好的做法,因为使用的是系统默认编码,取决于操作系统的设置,这会导致平台之间的不兼容。
程序员在Windows上写入日志文件而不指定编码。日志在Linux或Mac上打开,但显示乱码而不是西里尔字母。
优点:
缺点:
程序员在处理文件时始终指定encoding='utf-8':
with open('log.txt', 'w', encoding='utf-8') as f: f.write('程序运行成功')
优点:
缺点: