python编码问题

最近在学python的爬虫,果然还是遇到了最让人头疼的编码问题,找了很久,终于在知乎找到一个很好的答案。

https://www.zhihu.com/question/31833164?sort=created
@Alex-金角大王 的回答真的令我茅塞顿开

读完他的解答,相信大多数人都会对编码问题有一个比较清晰的理解了,所以我这里也不再赘述。下面只是写出一些我的总结和一些遇到的难以理解的问题,以供自己回头查看,可能有些重复和浅薄,大家有兴趣的可以继续往下看。

在python3中,str 其实就是unicode编码的的字符集,所以下面的比较返回True

str = "\u53eb\u6211"
print(str == '叫我') // True

unicode是内存编码集,因为其效率较高,而且可以兼容所有的编码集,与utf-8和gbk等都能相互转换,通常在在内存中的数据都使用Unicode编码,而utf-8,gbk通常用作文件编码集,因为占据的空间较小。
如下图:
在这里插入图片描述
python3中str代表的就是unicode,即可以直接展示给我们看的,而encode()之后的数据用bytes存储。

所以我们存储数据时,使用encode()编码为utf8或gbk,读取展示数据时,使用decode()解码为unicode。
unicode 基于十六进制,通常以\u开头,utf8 基于二进制,通常以\x开头

爬取的数据如下:
content = b'<html><head><title>\xe6\x82\xa8\xe8\xae\xbf\xe9\x97\xae\xe7\x9a\x84\xe9\xa1\xb5\xe9\x9d\xa2\xe4\xb8\x8d\xe5\xad\x98\xe5\x9c\xa8!</title>'
可以知道,该数据是经过utf-8编码的数据,以字节进行传输,所以需要以utf-8的编码进行节码为unicode

content.decode() // 解码
爬取数据如下:
content  = b'{"errno":0,"data":[{"k":"baby","v":"n. \\u5a74\\u513f}'
\u 是unicode编码的,这个数据本应该是字符在内存中的样式,即可以直接展示给我们看的,但是他这里将数据又进行了编码,所以通过普通的decode(),以utf8解码为unicode后是这样的
content.decode(),并不是我们想要的数据
--{"errno":0,"data":[{"k":"baby","v":"n. \u5a74\u513f}

我刚开始觉得 \u5a74\u513就是unicode呀,为什么不显示出原来的字符,这不就和str == unicode这个说法是矛盾的吗?

后来仔细一看,不矛盾,decode()的确是将bytes转换为unicode了,但是原本的数据中有双斜杠(**\\**u5a74**\\**u513f),decode()后的数据只有单斜杆了,发生了转义。\u5a74\u513f 就是它本来要展示的样子,这种情况应该使用unicode_escape进行解码

content.decode(“unicode_escape”) // 解码
--{"errno":0,"data":[{"k":"baby","v":"n. 婴儿}

先写到这,以后遇到更多问题或理解再补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值