乱码产生的原因

乱码产生的根本原因是字节流转换字符前后不一致导致。只要掌握了这个核心,就能解决乱码问题,在java中,由于严格区分了字节流和字符,所以理解起来比较简单。但python2中使用了一些“trick”(没有区分字符和字节流),所以理解起来有些困难。在python中遇到没有指定为unicode的string,就理解为字节流! 字节流,没有编码,只有字节,所以在转换字符时经常会出现乱码。接下来说明乱码的几个点及解决办法。

源文件编码、字符串编码

在python中有2个地方的编码要注意,源文件的编码、字符串的编码,只要设置正确了就不会出现乱码。

源文件编码

在源文件的第一行或者第二行一定要声明文件的编码方式并且与文件编码一致,通常会将源文件保存为utf8,声明也是utf8,如

# coding=utf8

#coding:utf8

如果不指定源码文件编码格式,文件中包含非ascii字符就会出现错误。

SyntaxError: Non-ASCII character ‘\xe4’ in file test_encoding.py on line 3, but
no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

这是因为,如果不指定源文件编码,python解释器会按照默认的字符集ascii来解码文件,由于中文不属于ascii字符集,所以会出错。

字符串编码

字符串编码分两种情况,
指定了unicode:在字符串前边加u,如u'你好' ,这种情况不会出现乱码;
没指定unicode:普通字符串的写法,如'你好' ,这种情况字符串的编码与源文件编码一致;当字符串编码与控制台编码不一致时,就会出现乱码,这是因为python中的字符串就是字节数组,由于没有声明为unicode,所以按照windows terminal的默认编码gbk来解码(从字节数组转为字符),utf8的字节数组转为gbk的字符,肯定是不兼容的,所以出现了乱码。如

解决办法很简单,指定为unicode或者使用decode函数将字符串转为unicode编码。如

'你好' #这里没有指定编码,所以就是utf8的字节流,输出到控制台时,转为gbk,因为由utf8字节流--转--->gbk,不兼容,所以,就出现乱码了。
u'你好' #指定字符串为unicode编码
'你好'.decode('utf8')#将utf8的字符串解码为unicode

因为这里用到了decode函数,所以说一下decode、encode函数

decode(), 解码就是将字节流转为字符,python中特指,其他字符集(比如,utf8、gbk、isoo8859-1)解码为unicode
encode(),编码就是从字符转为字节流,python中特指,unicode编码为其他字符集(比如,utf8、gbk、isoo8859-1)

关于这个知识点可以这样理解,unicode包含世界所有的字符,编码、解码都要围绕unicode来进行,否则由于不兼容就会出错;从unicode到utf8就是编码,从utf8到unicode就是解码;

出现字符串的地方,都指定为unicode编码。

总结

综上所述,最简单的办法就是声明的编码类型与源文件一致出现字符串的地方都指定为unicode编码,能解决99%的乱码问题。python3默认就是unicode,不会出现这些问题了。

参考

pep-0263

python2 中文 乱码问题相关推荐

  1. Python2中文乱码处理

    背景 本文在Window7 & python2.7.13下运行测试. Python2处理中文字符时经常遇到乱码问题,根源在于python存储汉字的两种表示形式和Window系统编码之间的矛盾. ...

  2. python中文解释-python注释和2版本的中文乱码

    python里面的注释 一.普通注释 单行注释: # 多行注释:'''内容''' """内容""" ----两种写法,一种是以三个单引号括起 ...

  3. python绘图设置标题出现乱码_解决python2 绘图title,xlabel,ylabel出现中文乱码的问题...

    Python绘图如何显示中文标题一个懂得以幽默态度面对自己缺点并将缺点变成自己专属的特色-这才是真正乐观勇敢的人. 采用matplotlib作图时默认设置下是无法显示中文的,例如编写如下python脚 ...

  4. python2.7打印中文乱码的问题解决

    python2.7打印中文乱码的问题解决 参考文章: (1)python2.7打印中文乱码的问题解决 (2)https://www.cnblogs.com/pyweb/p/11492395.html ...

  5. Python2写csv文件中文乱码问题及解决方法详解

    导读 python2最大的坑在于中文编码问题,遇到中文报错首先加u,再各种encode.decode,这篇文章给大家介绍Python2写csv文件中文乱码问题及解决方法,感兴趣的朋友跟随小编一起看看吧 ...

  6. python2 with open encoding_python with open as f写中文乱码

    python3和python2的写法不一样具体如下: python3: with open(r'd:\ssss.txt','w',encoding='utf-8') as f: f.write(u'中 ...

  7. python读excel乱码_解决Python2.7读写文件中的中文乱码问题

    Python2.7对于中文编码的问题处理的并不好,这几天在爬数据的时候经常会遇到中文的编码问题.但是本人对编码原理不了解,也没时间深究其中的原理.在此仅从应用的角度做一下总结, 1.设置默认编码 在P ...

  8. python2中文输出代码_解决vscode python print 输出窗口中文乱码的问题

    解决vscode python print 输出窗口中文乱码的问题 发布时间:2020-09-17 23:53:25 来源:脚本之家 阅读:119 一.搭建 python 环境 在 VSC 中点击 F ...

  9. python查询mysql中文乱码问题

    相信很多在工作中的Python小伙伴,经常会遇到一些工作上的问题,例如查询mysql中文乱码问题,Python连接mysql数据库时,读取数据库中的中文出现乱码,所有中文都显示为问号了,那么该如何解决 ...

最新文章

  1. response.getWriter().write()和 response.getWriter().print()的区别
  2. 使用docker部署mysql 并持久化到宿主机本地
  3. peoplepicker控件的使用
  4. MongoDB的简单操作
  5. 服务器里的文件怎么实时更新,简单几步,利用Serverless,让COS中文件变更自动刷新CDN...
  6. 二十万字C/C++、嵌入式软开面试题全集宝典五
  7. Gradle的script API
  8. 面试精讲之面试考点及大厂真题 - 分布式专栏 20 降级组件Hystrix的功能特性
  9. Address already in use: JVM_Bind问题的解决
  10. pythonwhile循环实例 其和超过10_Python While循环语句
  11. wifi不断重连报错:eSIR_MAC_CLASS3_FRAME_FROM_NON_ASSOC_STA_REASON解决
  12. 二进制转bcd码c语言程序,微机课设求助 BCD码转换为二进制
  13. 小米球Ngrok内网穿透教程
  14. Win10 安装 IE11 教程
  15. fu7推挽胆机音质_fu7电子管功放电路图大全(6N8P\6P3P\胆机功放电路\耦合电容器)...
  16. DiffMerge 工具记录
  17. 浅谈setOnClickListener使用方法
  18. 百奥虫草:科学养生健康梦想航天城里笑声朗
  19. NLP会议介绍 2019
  20. 记录一次在linux上配置ssl证书

热门文章

  1. 为什么公司和企业家需要区块链
  2. 【论文详读】Overcoming catastrophic forgetting in neural networks
  3. 2023深圳服务机器人展览会定档4月9-11日
  4. Neuron:大脑半球特异化对人类认知有何贡献?
  5. 2021第三届传智杯决赛全题解
  6. 百度宣布首例"人工智能"寻找走失儿童完成
  7. 图像分割中OTSU算法
  8. 【数据结构】List相关知识的学习【详解篇2】
  9. 智能化整体图例,布线、安防、广播会议、电视、楼宇、消防、电气图的图例【转自微信公众号弱电课堂】
  10. 超详细,手把手教你一次简单的SQL注入,不用任何工具,带你走进web安全的大门