在乱码问题上,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的字符编码乱码问题解决思路相关推荐

  1. 解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)——ubuntu环境设置默认是utf-8,文件编码可使用Encodersoft批量转换

    解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)--ubuntu环境设置默认是utf-8,文件编码可使用Encodersoft批量转换 参考文章: (1)解决Qt中文乱码以及汉字编码的问题(U ...

  2. 【转】刨根究底字符编码之九——字符编码方案的演变与字节序

    字符编码方案的演变与字节序 一.字符编码方案的演变 1. 根据前面的介绍,对于字符编码方案的演变,我们大致上可简单地划分为三个阶段: ① ASCII编码方案阶段 → ② ANSI编码方案阶段 → ③ ...

  3. php 删除mysql 返回_php 返回mysql字符编码与删除字符编码

    php 返回mysql字符编码与删除字符编码 function Ebak_GetSetChar($char){ global $empire; if(empty($char)) { return '' ...

  4. python转utf-8编码_python3中utf-8编码如何转换?

    python中的编码之间可以相互转换,这个我们在之前的文章中有讲到.那小编开始提问了,utf-8编码如何转换?有的小伙伴可能对这个词模模糊糊的有点印象.但是如果我们提到unicode编码大家就会觉得很 ...

  5. python3默认的字符编码和文件编码_Python的字符编码之三个问题

    看过很多关于Python字符编码的博客,或深或浅,总感觉有点云里雾里,今天这里我尝试用我的方式也来凑个热闹. 首先,我们要弄清楚几个问题,这个对我们后面的理解非常重要. 字节与字符 Python源代码 ...

  6. idea console中文乱码_Python3的字符编码乱码问题解决思路

    在乱码问题上,Python3相比Python2已经好多了,但在处理外来字符时比如文件或者网站时还是会出现乱码问题. 乱码的原因很多,一个是来源的字符编码在接收时处理不当,编程语言默认的UTF8处理gb ...

  7. mysql的字符集编码_MySQL的字符编码设置

    -- 创建数据库时,设置数据库的编码方式 -- CHARACTER SET:指定数据库采用的字符集,utf8不能写成utf-8 -- COLLATE:指定数据库字符集的排序规则,utf8的默认排序规则 ...

  8. python默认采用什么字符编码_Python01.2.字符编码-输入输出

    1.字符编码 计算机存储的任何数据,包括各种文本.图片.音视频文件等等,实际上都是一串二进制数字01字节序列组成的.一个字节Byte(B)是8个比特bit(b).而字符,自然就是符号了.比如说二十六个 ...

  9. python字符编码讲解_python 字符编码讲解

    ASCII控制字符  Unicode编码 ASCII(American Standard Code for Information Interchange,美国信息互换标准代码,ASCⅡ)是基于拉丁字 ...

最新文章

  1. iOS安全之class-dump的安装和使用
  2. git clone错误 fatal: early EOF fatal: index-pack failed
  3. codevs 3164 质因数分解
  4. 大一java实训报告1500字_社会实践报告1500字
  5. 电气期刊论文实现:基于输电线路容量安全约束的电力机组组合
  6. Ms SQL Server 约束和规则
  7. Fedora 19 Mate环境安装Gnome3
  8. 九、Spring中使用@Value和@PropertySource为属性赋值
  9. 线性代数第九版pdf英文_《Linear Algebra Done Right》线性代数复习及部分习题解答(3.C)...
  10. 终止运行线程的注意事项
  11. java synchronizer_Java同步框架AbstractQueuedSynchronizer详解
  12. bash的快捷键、特殊参数、历史命令、相关文件
  13. 以二进制输出64位类型的数据_Java入门第五课:Java基本数据类型与变量的声明...
  14. 带键盘计算机,怎么屏蔽笔记本自带键盘
  15. 【小米手机ROOT记录】
  16. 集合覆盖模型例题_集合实例(集合覆盖)
  17. 远程桌面3389加固
  18. 论文《Dialogue State Tracking with a Language Model using Schema-Driven Prompting》学习笔记
  19. 球机器人 配重_DIY:拥有绝佳移动力的球平衡机器人
  20. 三维比例导引 matlab,三维比例导引律(源程序)

热门文章

  1. 在行列都排好序的矩阵中找数
  2. 文巾解题 1418. 点菜展示表
  3. 机器学习笔记:CNN卷积神经网络
  4. Windows下安装spark+Hadoop
  5. Linux质数合数的脚本,python输出100以内的质数与合数实例代码
  6. python 统计list中各个元素出现的次数
  7. 深度学习100例-卷积神经网络(CNN)识别眼睛状态 | 第17天
  8. csdn开源夏令营-ospaf中期报告
  9. 使用Skywalking实现全链路监
  10. RXJava by Example--转