python中字符串类型的encode()方法_python 的 encode 、decode、字节串、字符串

本文详细介绍了Python中字符串的编码与解码,包括ASCII、GBK、Unicode、UTF-8等编码格式,以及Python2和Python3的区别。讨论了在Python中如何使用encode和decode方法,以及在网络传输中字符串和字节串的转换。还提到了序列化和反序列化,特别是JSON在Python中的应用,以及如何处理中文字符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、摆个图

DJ  DJ  DJ   Decode、 J 解码

首先得知道字符串有哪些编码格式,至于为什么会有这么多的编码格式,以后再了解更新。

1、ASCII 占1个字节,只支持英文

2、GB2312 占2个字节,支持6700+汉字

3、GBK GB2312的升级版,支持21000+汉字,中文2个字节。

4、Unicode 2-4字节 已经收录136690个字符

5、UTF-8: 使用1、2、3、4个字节表示所有字符;优先使用1个字符、无法满足则使增加一个字节,最多4个字节。

英文占1个字节、欧洲语系占2个、东亚占3个,其它及特殊字符占4个。中文3个字节。

6、UTF-16: 使用2、4个字节表示所有字符;优先使用2个字节,否则使用4个字节表示。

在 python2 和 python3 默认的编码格式是不一样的。Python2默认是ASCII编码,python3 是unicode编码。所以在用python2 时候会 绕一下。

一般在用 python2 时候会先在开头加上

#coding=utf-8

Python2中默认是ASCII码,一般会加入以utf-8编程。那么这个时候所有用到的 字符串 都是 utf-8 的编码格式,中文也不例外。

#coding=utf-8#Python2中默认是ASCII码,一般会加入以utf-8编程

a = '编码' #a是utf-8类型

b = a.decode('utf-8') #b是Unicode类型

c = b.encode('gbk') #c是gbk类型

d = c.decode('gbk').encode('utf-8') #先将c转换成Unicode,再转成utf-8

printa ,b,c,dprint type(a),type(b),type(c),type(d)

python3 默认是Unicode 编码格式

a = '编码' #a是unicode类型

b = a.encode('utf-8') #b是utf-8类型

c = a.encode('gbk') #c是gbk类型

print(a ,b,c)print(type(a),type(b),type(c))#python3默认是unicode类型

encode 出来的 永远是 字节串。

二、encode、decode

字符串的编码解码第一次接触是在 socket编程,socket 套接字传输的必须是字节串,其实Bytes才是计算机里真正的数据类型,也是网络数据传输中唯一的数据格式,什么Json,Xml这些格式的字符串最后想传输也都得转成Bytes的数据类型才能通过socket进行传输,而Bytes的数据与字符串类型数据的转换就是编码与解码的转换,utf-8是编解码时指定的格式。所以在 发送数据时候做了一步 字符串编码   str.encode('utf-8') ,编码格式选的 utf-8,这样就把字符串变成了字节串。【在python3 时候的操作】

在 接收端,接收到的数据需要转码,rev.decode('utf-8') ,编解码的格式可以自己选择。

这里存在一个数据传输隐患。当传输的数据超过一次性最大接收量,或者多次传输,那数据流被分割为多个部分,那么我们就不知道某个字符是否由于位于分割边界而从中间被分开。此时对部分接受的信息进行解码是很危险的。比如中文,在编码后是多字节的形式。编码方式主要分为两大类,单字节编码和多字节编码,前者即每个字符与字节的值唯一对应,后者中每个字符可能会用多个字节来表示。由于在一些多字节编码方式中,用于表示不同字符的字节数是不同的,因此操作起来要多加小心。

三、序列化、反序列化   json

不同的编程语言有一个共同的数据类型---字符串类型。

所以要实现不同的编程语言之间对象的传递,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便。

在python中,序列化可以理解为:把python的对象编码转换为json格式的字符串,反序列化可以理解为:把json格式字符串解码为python数据对象。在python的标准库中,专门提供了json库与pickle库来处理这部分。

json的dumps方法和loads方法,可实现数据的序列化和反序列化。具体来说,dumps方法,可将json格式数据序列为Python的相关的数据类型;loads方法则是相反,把python数据类型转换为json相应的数据类型格式要求。在序列化时,中文汉字总是被转换为unicode码,在dumps函数中添加参数ensure_ascii=False即可解决。

importjsonprint (json.__all__) #查看json库的所有方法

['dump', 'dumps', 'load', 'loads', 'JSONDecoder', 'JSONEncoder']

=========================================== dumps 序列化

未在dumps函数中添加参数ensure_ascii=False,结果如下:#coding: utf-8

importjson

dict= {'name':'zhangsan', 'age':33, 'address':'红星路'}print('未序列化前的数据类型为:', type(dict))print('为序列化前的数据:', dict)#对dict进行序列化的处理

dict_xu = json.dumps(dict) #直接进行序列化

print('序列化后的数据类型为:', type(dict_xu))print('序列化后的数据为:', dict_xu)

结果:

未序列化前的数据类型为:为序列化前的数据: {'name': 'zhangsan', 'address': '红星路', 'age': 33}

序列化后的数据类型为:序列化后的数据为: {"name": "zhangsan", "address": "\u7ea2\u661f\u8def", "age": 33}

在dumps函数中添加参数ensure_ascii=False,结果如下:#coding: utf-8

importjson

dict= {'name':'zhangsan', 'age':33, 'address':'红星路'}print('未序列化前的数据类型为:', type(dict))print('为序列化前的数据:', dict)#对dict进行序列化的处理

dict_xu = json.dumps(dict,ensure_ascii=False) #添加ensure_ascii=False进行序列化

print('序列化后的数据类型为:', type(dict_xu))print('序列化后的数据为:', dict_xu)

结果:

未序列化前的数据类型为:为序列化前的数据: {'address': '红星路', 'age': 33, 'name': 'zhangsan'}

序列化后的数据类型为:序列化后的数据为: {"address": "红星路", "age": 33, "name": "zhangsan"}

==================================================== loads 反序列化#coding: utf-8

importjson

dict= {'name':'zhangsan', 'age':33, 'address':'红星路'}print('未序列化前的数据类型为:', type(dict))print('为序列化前的数据:', dict)#对dict进行序列化的处理

dict_xu = json.dumps(dict,ensure_ascii=False) #添加ensure_ascii=False进行序列化

print('序列化后的数据类型为:', type(dict_xu))print('序列化后的数据为:', dict_xu)#对dict_xu进行反序列化处理

dict_fan =json.loads(dict_xu)print('反序列化后的数据类型为:', type(dict_fan))print('反序列化后的数据为:', dict_fan)

结果:

未序列化前的数据类型为:为序列化前的数据: {'name': 'zhangsan', 'age': 33, 'address': '红星路'}

序列化后的数据类型为:序列化后的数据为: {"name": "zhangsan", "age": 33, "address": "红星路"}

反序列化后的数据类型为:反序列化后的数据为: {'name': 'zhangsan', 'age': 33, 'address': '红星路'}

在 实际运用中,序列化或者反序列化的可能是一个文件的形式,不可能像如上写的那样简单的,下来就来实现这部分,把文件内容进行序列化和反序列化,

序列化, 两步操作:1、先序列化 列表对象 ;2、步把序列化成的字符串写入文件:

反序列化,两步操作:1、先读取文件的字符串对象;2、然后反序列化成列表对象:#coding: utf-8

importjson

list= ['Apple','Huawei','selenium','java','python']#把list先序列化,写入到一个文件中#两步操作 1步先序列化 列表对象 2步把序列化成的字符串写入文件

json.dump(list, open('e:/test.txt','w'))

r1=open('e:/test.txt','r')print(r1.read())#------------------------------------------------------------#两步操作:1、先读取文件的字符串对象;2、然后反序列化成列表对象

res=json.load(open('e:/test.txt','r'))print(res)print('数据类型:',type(res))

结果:

["Apple", "Huawei", "selenium", "java", "python"]

['Apple', 'Huawei', 'selenium', 'java', 'python']

数据类型:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值