Python3字符编码机制详解:从Python2缺陷到UTF-8默认设置

落日邮差
落日邮差
发布时间:2026-10-13 | 3人浏览过
原创

本文深入解析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之禅'

总结

以上就是本文的全部内容,希望这些内容能对您的学习或工作有所帮助。如有任何疑问,欢迎留言交流。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表