因为中文的特殊编码,导致 Python2 和 Python3 使用过程中的各种编码问题,如果不清楚其中的关联关系,那么这就一直是个大坑,不是懵逼就还是懵逼,所以就目前碰到的情况彻底梳理下 Python2 和 Python3 中编码的关系和区别,以作备忘。

先说下涉及编码格式的几个地方:脚本字符编码:就是经常在脚本文件开头看到的# -*- coding: utf-8 -*-,如果使用 Python2,没有显式声明的话默认使用 ASCII 格式,Python3 默认使用 utf-8 格式;

解释器字符编码:可以通过函数sys.getdefaultencoding()查看,Python2 默认是 ASCII,Python3 默认使用 utf-8;

脚本文件存储编码:就是 py 脚本文件本身在物理介质上面的存储格式,通常有 ASCII、GBK、utf-8 等格式。

下面我们把上述编码分别在脚本中进行组合使用后,再使用 Python2.6 和 Python3.4 运行,看看实际都什么效果。

1.默认脚本文件编码 + 文件存储使用 gbk

脚本内容:importsys

print(sys.getdefaultencoding())

print('中文')

使用 Python2.6 运行的结果如下,提示gbk 编码字符\xd6非 ASCII 字符:> python26 test_gbk.py

File"test_gbk.py", line4SyntaxError: Non-ASCII character'\xd6'infile test_gbk.py on line4, but no encoding declared; see http://www.python.org/peps/pep-0263.htmlfordetails

使用 Python3.4 运行的结果如下,提示gbk 编码字符\xd6非 utf-8 字符:> python26 test_gbk.py

File"test_gbk.py", line4SyntaxError: Non-UTF-8code startingwith'\xd6'infile test_gbk.py on line4, but no encoding declared; see http://python.org/dev/peps/pep-0263/fordetails

结论:默认的 gbk 编码中文,Python2的解释器字符编码(ASCII)和 Python3的解释器字符编码(utf-8)格式都没法识别,因为 ASCII 编码不包含中文,而 utf-8 是 3 字节编码,gbk 是 2 字节编码,所以都识别不了了。

2.脚本文件编码 gbk + 文件存储使用 gbk

在刚才的脚本头部显式声明脚本文件编码格式为 gbk:#coding:gbkimportsys

print(sys.getdefaultencoding())

print('中文')

使用 Python2.6 运行的结果:> python26 test_gbk.py

ascii

中文

使用 Python3.4 运行的结果:> python34 test_gbk.py

utf-8中文

结论:文件使用的 gbk 格式存储,同时显式声明了脚本文件编码为 gbk,Python2 和 Python3 都可以正常处理。

3.脚本文件编码 utf-8 + 文件存储使用 gbk

在刚才的脚本头部显式声明脚本文件编码格式为 utf-8:# -*- coding: utf-8 -*-importsys

print(sys.getdefaultencoding())

print('中文')

使用 Python2.6 运行的结果正常:> python26 test_gbk.py

ascii

中文

使用 Python3.4 运行的结果如下,提示尝试使用 utf-8 解码字符0xd6时异常:> python34 test_gbk.py

File"test_gbk.py", line6SyntaxError: (unicode error)'utf-8'codec can't decode byte 0xd6 in position 0: invalid continuation byte

结论:文件使用的 gbk 格式存储,同时显式声明了脚本文件编码为 utf-8时,但是 Python2 在 Windows 平台还是使用 gbk 进行输出,所以解析正常,而 Python3 使用 utf-8 所以解析异常。

4.默认脚本文件编码 + 文件存储使用 utf-8

去掉之前脚本头部的声明,然后使用 utf-8 格式存储文件(注意,不能在刚才的文件基础上强制修改存储编码,强制转换会出现中文乱码的问题,建议先新建一个 utf-8 格式的文件,然后再输入中文):importsys

print(sys.getdefaultencoding())

print('中文')

使用 Python2.6 运行的结果如下,ASCII 也识别不了 utf-8 格式的字符\xe4:> python26 test.py

File"test.py", line4SyntaxError: Non-ASCII character'\xe4'infile test.py on line4, but no encoding declared; see http://www.python.org/peps/pep-0263.htmlfordetails

使用 Python3.4 运行的结果,可以正常识别,因为 Python3 默认使用 utf-8 编码:> python34 test.py

utf-8中文

结论:默认的 utf-8 编码中文,Python2 会默认使用 ASCII 读取,所以没法识别,Python3 可以正常识别。

5.脚本文件编码 gbk + 文件存储使用 utf-8

脚本头部显式声明脚本文件编码格式为 gbk,同时使用 utf-8 格式存储文件:#coding:gbkimportsys

print(sys.getdefaultencoding())

print('中文')

使用 Python2.6 运行的结果如下,使用 gbk 根本读取不了 utf-8 格式任何内容:> python26 test.py

File"test.py", line6SyntaxError:'gbk'codec can't decode bytes in position 9-10: illegal multibyte sequence

使用 Python3.4 运行的结果如下,其实和上面错误一样,但是提示更直接了:> python34 test.py

File"test.py", line1SyntaxError: encoding problem: gbk

结论:默认的 utf-8 编码中文,如果显式指定使用 gbk 读取,Python2 和 Python3 都没法做到。

6.脚本文件编码 utf-8 + 文件存储使用 utf-8

脚本头部显式声明脚本文件编码格式为 utf-8,同时使用 utf-8 格式存储文件:# -*- coding: utf-8 -*-importsys

print(sys.getdefaultencoding())

print('中文')

使用 Python2.6 运行的结果如下,虽然读取正确了,但是 Python2 在 Windows 系统会默认使用 gbk 对中文进行解码,所以输出乱码:> python26 test.py

ascii

涓枃

使用 Python3.4 运行的结果正常:> python34 test.py

utf-8中文

结论:虽然文件存储编码和脚本文件编码都是 utf-8,但是 Windows 平台上,Python2 会按 gbk 解析中文,所以会输出乱码,可以在中文前面加 u 来解决u'中文',或者显式使用 utf-8 进行一次 decode。

汇总下验证结果,可以得到如下的表格:不同组合下 Python3 和 Python2 处理结果Python3Python2默认脚本文件编码 + 文件存储使用 gbkSyntaxError,解析错误SyntaxError,解析错误

脚本文件编码 gbk + 文件存储使用 gbk正常输出中文正常输出中文

脚本文件编码 utf-8 + 文件存储使用 gbkSyntaxError,解析错误正常输出中文

默认脚本文件编码 + 文件存储 utf-8正常输出中文SyntaxError,解析错误

脚本文件编码 gbk + 文件存储使用 utf-8SyntaxError,解析错误SyntaxError,编码错误

脚本文件编码 utf-8 + 文件存储使用 utf-8正常输出中文中文输出乱码

总结下结论:如果使用 Python2 请一定要使用 gbk 格式存储文件;

如果使用 Python2 尽可能使用 gbk 存储文件且显式声明脚本文件编码为 gbk,方便后续兼容 Python3;

如果使用 Python3 不管使用什么格式存储文件,但请一定保证显式声明脚本文件编码和存储格式一致;

不管是使用 Python2 还是 Python3,保持显式声明脚本文件编码的好习惯;

如果脚本有跨平台需求,推荐使用 Python3 + 脚本文件编码 utf-8 + utf-8 格式存储文件的组合;

彻底搞懂 python 中文乱码问题_彻底搞懂 Python 编码 - sylan215的软件测试技术学习 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...相关推荐

  1. 【python中文乱码】git bash终端运行python文件中文乱码的问题

    win终端正常运行但是在git bash 终端运行py文件中文乱码问题如下: 在python命令前加winpty之后则可以正常显示中文如下:

  2. mysql 散列存储_什么是数据库散列存储? - 蚂蚁吞大象的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...

    什么是数据库散列存储? 上一篇 / 下一篇  2012-11-30 17:25:03 / 个人分类:数据库 (转载自百度空间http://hi.baidu.com/pplboy/item/2d7a26 ...

  3. mysql物理读 逻辑读百分比_监控程序MYSQL - 子木清风 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...

    #!/usr/bin/env pythonv)K'WXS;}x3i.?0 #-*- coding: cp936 -*-V:EZ6][ P.E*K3i0 importthreading,os,time ...

  4. 银行系统日终结算要多久_银行 核心系统的清算与结算 - 系统性能与软件架构 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...

    清算与结算本来是两种业务,不过因为结算中通常又会包括清算,要分成两小节,每小节又说不了太多话,所以干脆放在一起算了,而且这一节只谈流程,不讲设计,这种业务流程理顺了自然就可以设计了. 先约定一下,商业 ...

  5. linux中的伪终端编程,Linux中的伪终端编程 - 残剑_飞雪的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...

    如何操作伪终端: 伪终端的使用是成对出现的,分为master 和 slaver 主设备:/dev/ptmx (i850上的主设备名) 从设备:动态生成:/dev/pts/0.......x 功能:写入 ...

  6. 软件测试缺陷等级划分_缺陷等级的各种划分方法 - 测试新客~~小懒~~ - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...

    <缺陷等级标准> 缺陷严重级别定义: o 最高级--导致运行中断(应用程序崩溃),预期的功能没有得到实现,测试工作无法继续进行等. o 紧急---事件非常重要,并且需要马上给予关注. o ...

  7. 解决python中文乱码的方法

    解决python中文乱码的方法 参考文章: (1)解决python中文乱码的方法 (2)https://www.cnblogs.com/bobodeboke/p/11935876.html 备忘一下.

  8. eclipse 编辑 python 中文乱码的解决方案

    eclipse 编辑 python 中文乱码的解决方案 参考文章: (1)eclipse 编辑 python 中文乱码的解决方案 (2)https://www.cnblogs.com/mouseIT/ ...

  9. python 中文乱码 \u5b66\u90a6\u5ba2\u6237

    python 中中文乱码问题解决:\u5b66\u90a6\u5ba2\u6237 设置codecs 打开文件的格式 import codecs with codecs.open(file, 'a', ...

最新文章

  1. xp启动java设置_Windows XP快速启动经典六招
  2. 独家 | 指南:不平衡分类的成本敏感决策树(附代码链接)
  3. 单个正态总体均值的区间估计_考研数学闭关修炼习题讲解(3536)统计、估计与检验...
  4. vue 强制刷新组件
  5. Demo:基于 Flink SQL 构建流式应用
  6. MySQL数据库备份之主从同步配置
  7. 生产服务器环境最小化安装后Centos 6.5优化配置备忘
  8. 剑网三12年的弹指一挥间,如今的本命年,游戏方面有多少突破呢?
  9. scale 和 transform-origin 实现线条从左侧进入,右侧离开效果
  10. Android Serializable与Parcelable原理与区别
  11. SQL SERVER 和EXCEL的数据导入导出
  12. Shell编程—【03】数学运算expr与bc浮点数运算
  13. 离散傅里叶变换(DFT)
  14. JAVA 如何控制模拟表单提交_java后端模拟表单提交
  15. 遭遇应用程序正常初始化失败
  16. Java多线程系列--【JUC集合04】- ConcurrentHashMap
  17. oracle加密传输的种子,oracle net manager 数据传输安全步骤详解
  18. 仿真软件测试基尔霍夫定律,标签:基尔霍夫定律
  19. 论文写作——如图所示
  20. LeetCode 力扣C++题解 575. 分糖果

热门文章

  1. oracle clob 回车换行问题
  2. ]解决在XP上sqlserver2005客户端安装的问题
  3. python内置作用域_python中的作用域
  4. Restoring Permutation CodeForces - 1315C(思维)
  5. 模拟退火总结+洛谷模板题(P1337 [JSOI2004]平衡点 / 吊打XXX)
  6. matlab armax 无法识别,求教:Java调用系统辨识工具箱内的armax函数出错
  7. qt 不显示 mysql 数据表中的内容_qt 数据库操作总结
  8. 开启简单的laravel5 MVC模式
  9. yml文件配置mysql表大小写_springboot常用配置(yml文件)
  10. 【数据分析学习】数据预处理