Python3字符串encode与decode详解:编码转换与常见误区

苏见山
苏见山
发布时间:2026-10-13 | 5人浏览过
原创

本文深入讲解Python3中字符串与字节码的转换机制。重点解析encode和decode方法的正确用法,阐明Python3默认使用Unicode编码的特性。通过实例演示UTF-8与GBK互转流程,并指出常见的AttributeError错误原因,帮助开发者避免编码转换陷阱。

Python3编码基础与类型区分

好久不见,临近年底工作繁忙,笔者也在深入钻研Python的其他领域。作为初学者,自学之路充满挑战。

今天重点讨论Python3在编码处理中的转码细节。

Python3严格区分文本与二进制数据。文本由str类型表示,默认采用Unicode编码;二进制数据则由bytes类型表示,两者不会混用。实际开发中,常需在这两种格式间进行转换。

需注意以下关键点:

encode与decode转换机制

1:字符串经编码转换为字节码,字节码经解码还原为字符串。

转换路径为:str通过encode()转为bytes,bytes通过decode()转为str。


import sys
print('目前系统的编码为:',sys.getdefaultencoding())
name='小明'
print(type(name))#首先我们来打印下转码前的name类型,因为它是str,所以可以通过encode来进行编码
name1=name.encode('utf-8')
print(name1)

运行结果如下:

当前系统默认编码为:utf-8 <class 'str'> b'\xe5\xb0\x8f\xe6\x98\x8e'

此处可能存在疑问:UTF-8编码为何不直接通过decode转为Unicode?

前文已提及,Python3默认编码即为Unicode。UTF-8可视作Unicode的扩展集,因此变量name本身已是Unicode编码。尝试将其encode为UTF-8不会报错,若误认为name是UTF-8编码再去encode,则逻辑不通。

常见编码错误与默认行为


name1=name.decode('utf-8')
print(name1)
这里会报如下错误:
AttributeError: 'str' object has no attribute 'decode'

综上,Python3默认采用Unicode编码。

既然已encode为UTF-8,接下来观察decode的结果。


name2=name1.decode('utf-8')
print(type(name2))
print(name2)
这里要跟大家说下,decode()括号中为什么写utf-8,而不写gbk,可以这样理解,因为要解码,你总得告诉它我是什么编码的吧,比如我原先是utf-8格式的编码,现在要解码,但是如果冒充utf-8,说自己是gbk,那就会出现乱码,见下:
<class 'str'>
<class 'str'>
灏忔槑

此外,若encode()和decode()未指定编码格式,系统默认使用UTF-8,读者可自行验证。

2:UTF-8与GBK编码格式的互转。

掌握UTF-8编解码规律后,尝试其与GBK的转换。

UTF-8与GBK互转实战


name1=name.encode('utf-8')
name2=name1.decode('utf-8')
name3=name2.encode('gbk')
name4=name3.decode('gbk')
print(type(name3))
print(name3)
下面是name3的结果
<class 'bytes'>
b'\xd0\xa1\xc3\xf7'
下面是name4的结果
<class 'str'>
小明

由上可知,name2先被解码为UTF-8(实为还原为Unicode),随后对name2进行GBK编码,再对name3进行GBK解码。

由此可见,UTF-8与GBK之间的转换均通过Unicode作为中间桥梁。

在示例中:


name2=name1.decode('utf-8')
name3=name2.encode('gbk')

这两步操作均通过Unicode进行转换。

总结。

以上内容为本文全部,希望能为读者的学习或工作提供参考。感谢支持,如需了解更多详情,请查阅相关链接。

本站声明

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

Python 相关产品和应用

全部下载

专题列表