Python3字符串encode与decode详解:编码转换与常见误区
本文深入讲解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进行转换。
总结。
以上内容为本文全部,希望能为读者的学习或工作提供参考。感谢支持,如需了解更多详情,请查阅相关链接。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









