社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python3 大作战之 encode 与 decode 讲解

CDA数据分析师 • 8 年前 • 459 次点击  

 作者   西欧伯爵

原文链接http://blog.csdn.net/qq_29053519/article/details/79170519

大家好,很久没更新了,也是年底了最近比较忙,同时也在研究python的其他内容,毕竟是python小白,自学道路艰难。


好了今天和大家一起探讨下python3编码过程中对的一些转码事宜。

python3中对文本和二进制做了比较清晰的区分。python3默认编码为unicode,由str类型进行表示。二进制数据使用byte类型表示,所以不会将str和byte混在一起。在实际应用中我们经常需要将两者进行互转,有几点需要注意:


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  
  
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,那就会出现乱码,见下:  
  
  
灏忔槑

另外如果大家encode()和decode()括号中不写编码格式,系统会默认为utf-8,大家可以试下。


2: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的结果  
  
b'\xd0\xa1\xc3\xf7'  
下面是name4的结果  
  
小明

从上面可以卡出name2本来是解码成utf-8的,后来有队name2进行了gbk编码,接着又再次对name3进行gbk解码


所以不难看出,其实utf-8和gbk之间都是通过unicode来做一个中间转换的操作

在例子中  
name2=name1.decode('utf-8')  
name3=name2.encode('gbk')  
这两步的操作就是通过unicode来转的


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/gmKfNWeZd4
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/6841