如何使用 Python 对字符进行编解码
Posted on Wed, 25 Dec 2024 16:09:34 +0800 by LiangMingJian
如何使用 Python 对字符进行编解码
前言
在计算机中,所有的字符都是以二进制代码存储的。计算机系统根据不同的编码格式,将二进制代码转换为相应的字符。
在 Python 中,我们可以通过 encode 和 decode 来对这些代码或字符进行编解码。
使用 encode 将字符编码
string = "我爱 Python"
print(string.encode("utf-8"))
上述代码在执行后会输出 我爱 Python 的 UTF-8 编码: b'\xe6\x88\x91\xe7\x88\xb1 Python'。
上述结果中,b 表示是一个字节串,而不是一个字符,其存储的是字符的原有二进制数值。
需要注意,Python 的字节串默认将中文以转义序列 \x?? 这种格式表示,\x 表示使用 2 位十六进制。而对于英文等 ASCII 字符,Python 往往会在输出时自动翻译。
我们可以遍历字节串,然后对每个十六进制代码通过字符格式化方法 format(byte, '08b') 转换为实际的二进制代码。
string = "我爱 Python"
for byte in string.encode("utf-8"):
print(' '.join(format(byte, '08b')))
上述代码执行结果:11100110 10001000 10010001 11100111 10001000 10110001 00100000 01010000 01111001 01110100 01101000 01101111 01101110。
可以看到,其结果正是 2 位十六进制数据。这一串二进制数据就是 我爱 Python 这一字符串以 UTF-8 格式在计算机系统中的存储内容。
使用 decode 将字符解码
code = b'\xe6\x88\x91\xe7\x88\xb1 Python'
print(code.decode('utf-8'))
decode 能将字节串按目标编码转换为实际的字符。比如上述代码,就将字节串 code 转换回 我爱 Python。
如何处理无效字节(乱码)
在编码解码时,有时候因为格式错误,字符串可能会携带一些无法被正确识别的字节,这种字节往往会导致乱码。此时我们可以在 encode 和 decode 时,通过传递 errors 参数,将这些无效字节进行处理。
code1 = b'\xe6\x88\x91\xe7\x88\xb1'
code2 = b'\xe6\x88\x91\xe7\x88\xff' # 包含无效字节 \xff
print(code1.decode('utf-8', errors='replace'))
print(code2.decode('utf-8', errors='replace'))
正如上述示例代码,当系统碰到无法解析的字节时,会使用特殊字符替换,然后继续执行。通过这样处理,即使出现异常无效字节,也不会打断程序的正常执行。
encode 和 decode 都支持以下 3 种错误字节的处理方法:
- ignore:忽略错误字节,返回空白。
- replace:使用特殊的占位符替换无效字节。
- backslashreplace:使用转移序列如 \xff 表示无效字节,即将无效字节直接打印出来。