python设置字符编码_Python的字符编码乱码问题解决思路

eac4b74543a98226d37e2281537b77044890ebdc.jpeg?token=4adf520128d33a7173e858b705a72bba&s=6BA090417E5233CE56B1059003005013

在乱码问题上,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系统变量。而且就算你设置对了,还要考虑是否当前字体是否支持中文,不然也是乱码。

有高人给了一个方法可以无视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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值