乱码产生的原因

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

源文件编码、字符串编码

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

源文件编码

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

1 #coding=utf8

1 #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编码。如

1 '你好' #这里没有指定编码,所以就是utf8的字节流,输出到控制台时,转为gbk,因为由utf8字节流--转--->gbk,不兼容,所以,就出现乱码了。

2 u'你好' #指定字符串为unicode编码

3 '你好'.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,不会出现这些问题了。

————————————————

版权声明:本文为CSDN博主「干净的句号」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/wangjun5159/article/details/52771277

python中字符串中文乱码_[python] 中文乱码问题相关推荐

  1. python中的logging记录日志_[ Python入门教程 ] Python中日志记录模块logging使用实例...

    python中的logging模块用于记录日志.用户可以根据程序实现需要自定义日志输出位置.日志级别以及日志格式. 将日志内容输出到屏幕 一个最简单的logging模块使用样例,直接打印显示日志内容到 ...

  2. python中深拷贝和浅拷贝_**Python中的深拷贝和浅拷贝详解

    甚至连type其本身都是对象,type对象 Python中变量与C/C++/Java中不同,它是指对象的引用,Python是动态类型,程序运行时候,会根据对象的类型 来确认变量到底是什么类型. 单独赋 ...

  3. python获取字符串首字母_[Python] Python 获取中文的首字母 和 全部拼音首字母

    原博文 2019-07-08 04:18 − Python 获取中文的首字母 和 全部拼音首字母 代码如下: import pinyin def getStrAllAplha(str): return ...

  4. python字符串前面加f什么意思_详解Python中字符串前“b”,“r”,“u”,“f”的作用...

    1.字符串前加 u 例:u"我是含有中文字符组成的字符串." 作用: 后面字符串以 Unicode 格式 进行编码,一般用在中文字符串前面,防止因为源码储存格式问题,导致再次使用时 ...

  5. python中abc属于字符串吗_在Python中,字符串s = 'abc',那么执行表达式s+'d'之后,s的打印结果是( )。...

    [单选题]当知道条件为真,想要程序无限执行直到人为停止的话,可以需要下列哪个选项? [单选题]Python3解释器执行 for i,v in enumerate([0,1,2],2):print(i, ...

  6. python二维列表转字典_在Python中字符串、列表、元组、字典之间的相互转换

    一.字符串(str) 字符串转换为列表 使用list()方法 str_1 = "1235" str_2 = 'zhangsan' str_3 = '''lisi''' tuple_ ...

  7. python字符串拼接数字_解决Python中字符串和数字拼接报错的方法

    解决Python中字符串和数字拼接报错的方法 前言 众所周知Python不像JS或者PHP这种弱类型语言里在字符串连接时会自动转换类型,如果直接将字符串和数字拼接会直接报错. 如以下的代码: # co ...

  8. Python中字符串前“b”,“r”,“u”,“f”的作用

    原文:https://www.jb51.net/article/176601.htm 原文有bug特参考:https://www.cnblogs.com/songzhenhua/p/13236794. ...

  9. Python中字符串的操作(图文详情)

    以下操作均在pycharm pycharm官方下载地址: https://www.jetbrains.com/pycharm/download/#section=windows 目录 python中字 ...

  10. 站长在线Python精讲:Python中字符串编码转换encode编码和decode解码详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<Python中字符串编码转换:encode编码和decode解码详解>.本知识点主要内容有:常用编码简介.使用encode( ...

最新文章

  1. JavaScript学习记录总结(四)——js函数的特殊性
  2. 单片机彩灯移动实验_单片机课程设计彩灯实验.doc
  3. tomcat jdbc SlowQueryReport的实现解读
  4. 【youcans 的 OpenCV 例程 200 篇】104. 运动模糊退化模型
  5. Oracle中给表添加主键 外键,给表中添加主键、外键
  6. jmap 文件解析_jvm系列:dump文件深度分析
  7. mysql 创建聚集索引_索引为什么会加快Mysql的查询速度?
  8. Reverse Linked List(非递归解法)
  9. C语言入门经典(第四版).pdf
  10. ubuntu20 卸载显卡驱动失败_Ubuntu20.04显卡驱动安装
  11. google手机连接wifi后提示“无法连接互联网“的原因和解决方法
  12. Codeforces 731C Socks By Assassin
  13. 《匆匆那年》的你,还记得吗?数学中的那些有(hui)趣(se)的定理(14)——毛球定理(Hairy ball theorem)
  14. 网络系统结构与设计的基本原理(二 )
  15. 执行python代码的方式_涨见识了,在终端执行 Python 代码的 6 种方式!
  16. Android Studio TCP客户端实现
  17. linux下查看cpu物理个数和逻辑个数 - chw1989的专栏 - 博客频道 - CSDN.NET
  18. Acronis 11, Hyper-V, windows 2008 R2 , and Windows loader by Daz
  19. 道格拉斯-普克Douglas-Peuker轨迹抽希算法和聚类算法联合应用于GPS轨迹数据处理
  20. vmware 显示器一拖二

热门文章

  1. 群友:事务中的异常不也抛出了,为什么没catch到而回滚?
  2. 每日一皮:没有好好测试就运行,还自信的不得了...
  3. 何时(不)使用Java抽象类
  4. 优雅处理你的Java异常
  5. 最好用的 IntelliJ 插件 Top 10
  6. php 自动登录脚本_php利用cookie实现自动登录的方法
  7. 4键电子手表说明书_电子手表怎么调(电子手表的四个键的功能各是什么)
  8. python 命名空间冲突_通过修改命名空间绕过pb冲突
  9. android+apk+修改+签名文件位置,Jenkins打包android应用时自动签名apk详解
  10. VSS介绍和备份技巧