python编码问题
程序员文章站
2022-07-14 19:02:12
...
最近在学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. 婴儿}
先写到这,以后遇到更多问题或理解再补充
上一篇: python编码问题1
下一篇: Python基础:编码问题