失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > python3 设置默认编码_Python3的字符编码乱码问题解决思路

python3 设置默认编码_Python3的字符编码乱码问题解决思路

时间:2023-04-24 16:40:45

相关推荐

python3 设置默认编码_Python3的字符编码乱码问题解决思路

在乱码问题上,Python3相比Python2已经好多了,但在处理外来字符时比如文件或者网站时还是会出现乱码问题。

乱码的原因很多,一个是来源的字符编码在接收时处理不当,编程语言默认的UTF8处理gb2312字符时没声明encoding,当然会出错。二是在代码用到的第三方代码使用了默认encoding处理了。三是在控制台或者文本编辑器中,这些程序本身也有默认的encoding。这三个环节没处理好都会出现乱码问题。

以一个最常见的爬虫程序为例。网站在head里本身虽然声明了gbk charset,但有可能是错的。 首先我们要确保requests没有改变编码,而用response.content 就可以确保这一点,因为它是字节流,也就是requests下载的原生内容。然后我们可以调用charset.detect方法判断encoding,结果输出是gb2312

知道来源的编码至关重要,不然我们就不清楚哪里出了错,只能不停试验可以的组合编码和转换。知道原有的编码以后,就可以在随后的每一行代码里查看encoding是否发生改变,如果出现乱码,就可以肯定在这一行指定的encoding有错。

一般来说我们可以print下查看是否有乱码。但这里有个巨大的坑,要看你用的操作系统,终端程序或者IDE。象windows可能是gb2312或者UTF16, Linux则要设置Locale系统变量。而且就算你设置对了,还要考虑是否当前字体是否支持中文,不然也是乱码。

万能的SO有高人给了一个方法可以无视console的encoding, 直接用sys.out.buffer.write() ,但前提是stdout用了正确的编码匹配你的字符变量的编码。sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

完整的程序如下,在cmd.exe, pycharm, wsl终端下都可以完美显示import requests

import sys

import io

import chardet

if __name__ == '__main__':

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

r = requests.get(sys.argv[1], proxies={"http": "http://127.0.0.1:1080"})

# print(chardet.detect(r.content))

rr = r.content.decode('gb18030')

rr = rr.encode('utf-8')

sys.stdout.buffer.write(rr)

如果觉得《python3 设置默认编码_Python3的字符编码乱码问题解决思路》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。