Python3字符编码机制详解:从Python2缺陷到UTF-8默认设置
本文深入解析Python3如何解决Python2遗留的字符编码问题。通过对比Python2中ASCII默认编码及str/unicode混淆的缺陷,阐述Python3将默认编码设为UTF-8,并清晰区分str(文本)与bytes(二进制)类型。文章详细说明了bytes类型的定义、操作限制及与str的转换方法,包括encode和decode的具体应用,帮助开发者避免编码错误。
编码
计算机底层仅能处理数字,因此处理文本时必须先将文本转换为数字。早期计算机设计以8个比特(bit)为一个字节(byte),单个字节能表示的最大整数为255(二进制11111111)。若需表示更大的整数,则需增加字节数,例如两个字节最大可表示65535,四个字节最大可表示4294967295。
由于计算机由美国发明,早期编码表仅包含127个字符,涵盖大小写英文字母、数字及部分符号,即ASCII编码。例如,大写字母A的编码值为65,小写字母z的编码值为122。
Python3字符编码
Python3的一项核心改进是解决了Python2中字符串与字符编码遗留的重大问题。
Python2在字符串设计上存在以下缺陷:
- 默认采用ASCII编码,导致中文处理体验极差。
- 强行将字符串区分为unicode和str两种类型,容易误导开发者。
上述情况虽非Bug,但需开发者格外小心以避免陷阱。Python3已完美解决这两个问题。
首先,Python3将系统默认编码设置为UTF-8。
>>> import sys >>> sys.getdefaultencoding() 'utf-8' >>>
其次,Python3更清晰地区分了文本字符与二进制数据:文本字符统一使用str类型表示,该类型能覆盖Unicode字符集中的所有字符;二进制字节数据则采用全新的bytes类型表示。
str
>>> a = "a" >>> a 'a' >>> type(a) <class 'str'> >>> b = "禅" >>> b '禅' >>> type(b) <class 'str'>
bytes
在Python3中,字符引号前添加'b'即明确标识为bytes类型对象,其本质是一组二进制字节序列。bytes类型可包含ASCII范围内的字符及十六进制形式的字符数据,但严禁直接使用中文等非ASCII字符进行字面量表示。
>>> c = b'a' >>> c b'a' >>> type(c) <class 'bytes'> >>> d = b'\xe7\xa6\x85' >>> d b'\xe7\xa6\x85' >>> type(d) <class 'bytes'> >>> >>> e = b'禅' File "<stdin>", line 1 SyntaxError: bytes can only contain ASCII literal characters.
bytes类型提供与str类似的操作,支持分片、索引及基本数值运算。然而,str与bytes类型数据之间不能执行+拼接操作,这与Python2中的可行行为不同。
>>> b"a"+b"c" b'ac' >>> b"a"*2 b'aa' >>> b"abcdef\xd6"[1:] b'bcdef\xd6' >>> b"abcdef\xd6"[-1] 214 >>> b"a" + "b" Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can't concat bytes to str
python2 与 python3 字节与字符的对应关系
| python2 | python3 | 表现 | 转换 | 作用 |
| str | bytes | 字节 | encode | 存储 |
| unicode | str | 字符 | decode | 显示 |
encode 与 decode
str与bytes之间的转换可通过encode和decode方法实现。

encode方法负责将字符编码为字节,默认使用UTF-8编码进行转换。
>>> s = "Python之禅"
>>> s.encode()
b'Python\xe4\xb9\x8b\xe7\xa6\x85'
>>> s.encode("gbk")
b'Python\xd6\xae\xec\xf8'
decode方法负责将字节解码为字符,通常使用UTF-8编码格式进行转换。
>>> b'Python\xe4\xb9\x8b\xe7\xa6\x85'.decode()
'Python之禅'
>>> b'Python\xd6\xae\xec\xf8'.decode("gbk")
'Python之禅'
总结
以上就是本文的全部内容,希望这些内容能对您的学习或工作有所帮助。如有任何疑问,欢迎留言交流。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









