python | 字符串编码问题怎么破

python字符串常见两种类型:str和 bytes类型
str表示Unicode字符,bytes表示二进制数据
两者之间转换使用:encode()和decode()方法

一、enocde()和decode()方法

(一)encode()方法

encode()—编码,语法:

str.encode([encoding="utf-8"][,errors="strict"])
参数释义
str表示要进行转换的字符串
encoding = “utf-8”可选参数,指定进行编码时采用的字符编码类型,常用有utf-8、gb2312。默认值为utf-8,当只使用encoding参数时,可写成:str.encode(‘utf-8’)
errors = “strict”指定错误处理方式—strict:遇到非法字符抛出异常,ignore:忽略非法字符,replace:用“?”替换非法字符,xmlcharrefreplace:使用 xml 的字符引用。默认值为strict

(二)decode()方法

decode()—解码,语法:

bytes.decode([encoding="utf-8"[,errors="strict"])
参数释义
bytes表示要进行转换的二进制数据
encoding=“utf-8”指定解码时采用的字符编码,默认采用utf-8格式,当只使用encoding参数时,可写成:bytes.decode(‘utf-8’)
errors = “strict”同encode的errors参数一样

注: python3.x默认采用utf-8编码格式,较好解决了中文乱码问题。

二、常见转化使用场景

(一)将str类型字符串进行编码

a_str = '当时只道是寻常'
a_stru = a_str.encode('utf-8')
a_struc = a_str.encode('unicode-escape')
print('str转换为bytes(utf-8):\n', a_stru)
print('str转换为bytes(unicode):\n', a_struc)

在这里插入图片描述

(二)将二进制(bytes)字符串解码为str类型字符串

在进行解码之前,要先确定目标字符串是什么类型的数据格式
因为不是所有以\x、\u开头的字符串都是bytes类型
python3中字符串默认都为unicode(str类型),只有加上前缀b的字符串,才是bytes类型

b_str = '\xe5\xbd\x93'
b_str1 = b'\xe5\xbd\x93'
print('b_str数据类型:', type(b_str))
print('b_str1数据类型:', type(b_str1))

在这里插入图片描述
python常见字符串前缀含义

字符释义
uu’当时只道是寻常’,前缀u表示该字符串是unicode(str类型)。python2中,用在含有中文字符的字符串前,防止因为编码问题,导致中文出现乱码。python3中,所有字符串默认都是unicode(str类型),可以不用。
rr’当时只道是寻常\n\n’,前缀r表示该字符串是原始字符串,即\不是转义符,只是单纯的一个符号,常用于文件路径。
bb’赌书消得泼茶香,当时只道是寻常。',表示该字符串类型为bytes,用于python3中,python3字符串默认都是unicode(str类型)。python2的字符串本身就是bytes类型,可以不用。

确定目标字符串的类型后,就可以根据需求解码字符串。
常见有以下几种用法

1、用例1

decode()方法的常规操作,就是把bytes类型字符串进行解码

b_str = b'\xe5\xbd\x93\xe6\x97\xb6\xe5\x8f\xaa\xe9\x81\x93\xe6\x98\xaf\xe5\xaf\xbb\xe5\xb8\xb8'
b_str1 = b'\\u5f53\\u65f6\\u53ea\\u9053\\u662f\\u5bfb\\u5e38'
print('b_str解码:', b_str.decode('utf-8'))
print('b_str1解码:', b_str1.decode('unicode_escape'))

在这里插入图片描述

2、用例2

有时,需要把一些以\x、\u开头的str类型字符串进行解码。常见于网络爬虫程序文本抓取后。
当直接使用decode()方法对str类型字符串进行解码,将会报错,如下:

str1 = '\xe5\xbd\x93'
print(str1.decode('utf-8'))

在这里插入图片描述
解决办法: 先将str类型字符串编码成bytes类型,再进行解码。

str1 = '\xe5\xbd\x93\xe6\x97\xb6\xe5\x8f\xaa\xe9\x81\x93\xe6\x98\xaf\xe5\xaf\xbb\xe5\xb8\xb8'
str2 = '\\u5f53\\u65f6\\u53ea\\u9053\\u662f\\u5bfb\\u5e38'
str1j = str1.encode('iso-8859-1').decode()
str2j = str2.encode().decode('unicode_escape')
print('str1解码:', str1j)
print('str2解码:', str2j)

在这里插入图片描述

以上就是字符串编码问题解决办法。

-end-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一位代码

感谢您的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值