Python使用request.get函数,返回的网页内容为UNCOIDE编码,中文出现乱码解决方案
问题描述:
解决这个问题,首先确保你的编辑器,运行环境中,'中文’这样的字符串是能够打印出来的。(我所使用的VScode自带OUTPUT,会产生中文乱码。所以我改为直接用Terminal来运行Python。)接着,如果还疑惑request得到的内容还是中文乱码,请继续看下去!
通过request.get
访问网站,网站返回的是Unicode-escape格式的字节流。
例:
r = b'{"code": 1, "proxies": [{"https": "0.0.0.0:8008",
"\\u6700\\u540e\\u9a8c\\u8bc1\\u65f6\\u95f4": "2019-10-23 09:14:15",
"\\u9a8c\\u8bc1\\u6b21\\u6570": 1, "\\u7c7b\\u578b": "\\u9ad8\\u533f"}]}'
如何将其变回为中文呢?
解决方法:
r.decode("unicode-escape")
解答:
拿'b\\u9ad8'
(高)字来说:
我们从网站上通过requests.get(url).content
得到的是bytes字节流对象。
->b'\\u9ad8'
。
b'\\u9ad8'
其实是unicode-escape格式的字节流,表示的是"高"字(和常见的unicode格式'\u9ad8'
是不同之处在于它用\\u
来标记为unicode编码,而unicode格式用\u
标记为unicode编码)。
我们用decode(“unicode-escape”)对其进行解码,它就能理解为是汉字了。
思考
我个人觉得\
和\\
是不同的环境中的影响。可能不是上面我所说的内容。但有了更准确地理解,我会第一时间更新博客的。解决方法肯定是对的,读者尽管放心,若有指点,不胜荣幸!
补充:
1. encode函数和decode函数
- encode作用将当前字符串按指定格式编码为bytes字节流。
- decode作用将字节流按指定格式解码为字符串。
- str对象是没有decode的,bytes对象才有decode
比如:
r = "中文"
print(r, type(r)) # "中文" <class 'str'>
r= r.encode("utf-8")
print(r, type(r)) # b'\xe4\xb8\xad\xe6\x96\x87' <class 'bytes'>
r = r.decode("gb2312")
print(r, type(r)) # "中文" <class 'str'>
2. Python运行时将字符串转为Unicode格式
- Python3中输入输出不管是什么格式,中间转接的都是Unicode格式。
比如输入是汉字,python内部的过程是 ‘请’→'\u8bf7'
→’请’
你如果在Python中print('\u8bf7')
,得到的就是’请’字,可知Python能直接识别你的字符串中Unciode格式的内容。
3. 编码
\x
是16进制,后面跟两位,表示单字节编码。\u
是unicode码,后面跟4个16进制数。
3. 这一问题我刚开始的想法
我们从网站得到的字符串是"\\u6700"
(误),转义符\
将\
转义了,就不能用\u来表示unicode格式了,所以只能识别为一个普通的字符串(实际上这是unicode-escape格式)。你对其encode("utf-8")
得到的是b'\\u6700'
'\u8bf7'
(python直接识别为’请’) -> 经过encode('utf-8')
后 ->b'\xe8\xaf\xb7'
(此过程将unicode格式的字符串转为utf-8格式的字节流)'\\u8bf7'
-> 经过encode('utf-8')
后 ->b'\\u8bf7'
(此过程将一个普通的字符串同样转为utf-8格式的字节流)
参考
https://www.kawabangga.com/posts/2767