python编码规范utf8还是gbk还是ask_彻底搞懂 Python 编码
因为中文的特殊编码,导致 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
脚本内容:
import sys
print(sys.getdefaultencoding())
print('中文')
使用 Python2.6 运行的结果如下,提示gbk 编码字符\xd6非 ASCII 字符:
> python26 test_gbk.py
File "test_gbk.py", line 4
SyntaxError: Non-ASCII character '\xd6' in file test_gbk.py on line 4, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
使用 Python3.4 运行的结果如下,提示gbk 编码字符\xd6非 utf-8 字符:
> python26 test_gbk.py
File "test_gbk.py", line 4
SyntaxError: Non-UTF-8 code starting with '\xd6' in file test_gbk.py on line 4, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
结论:默认的 gbk 编码中文,Python2的解释器字符编码(ASCII)和 Python3的解释器字符编码(utf-8)格式都没法识别,因为 ASCII 编码不包含中文,而 utf-8 是 3 字节编码,gbk 是 2 字节编码,所以都识别不了了。
2.脚本文件编码 gbk + 文件存储使用 gbk
在刚才的脚本头部显式声明脚本文件编码格式为 gbk:
#coding:gbk
import sys
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 -*-
import sys
print(sys.getdefaultencoding())
print('中文')
使用 Python2.6 运行的结果正常:
> python26 test_gbk.py
ascii
中文
使用 Python3.4 运行的结果如下,提示尝试使用 utf-8 解码字符0xd6时异常:
> python34 test_gbk.py
File "test_gbk.py", line 6
SyntaxError: (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 格式的文件,然后再输入中文):
import sys
print(sys.getdefaultencoding())
print('中文')
使用 Python2.6 运行的结果如下,ASCII 也识别不了 utf-8 格式的字符\xe4:
> python26 test.py
File "test.py", line 4
SyntaxError: Non-ASCII character '\xe4' in file test.py on line 4, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
使用 Python3.4 运行的结果,可以正常识别,因为 Python3 默认使用 utf-8 编码:
> python34 test.py
utf-8
中文
结论:默认的 utf-8 编码中文,Python2 会默认使用 ASCII 读取,所以没法识别,Python3 可以正常识别。
5.脚本文件编码 gbk + 文件存储使用 utf-8
脚本头部显式声明脚本文件编码格式为 gbk,同时使用 utf-8 格式存储文件:
#coding:gbk
import sys
print(sys.getdefaultencoding())
print('中文')
使用 Python2.6 运行的结果如下,使用 gbk 根本读取不了 utf-8 格式任何内容:
> python26 test.py
File "test.py", line 6
SyntaxError: 'gbk' codec can't decode bytes in position 9-10: illegal multibyte sequence
使用 Python3.4 运行的结果如下,其实和上面错误一样,但是提示更直接了:
> python34 test.py
File "test.py", line 1
SyntaxError: encoding problem: gbk
结论:默认的 utf-8 编码中文,如果显式指定使用 gbk 读取,Python2 和 Python3 都没法做到。
6.脚本文件编码 utf-8 + 文件存储使用 utf-8
脚本头部显式声明脚本文件编码格式为 utf-8,同时使用 utf-8 格式存储文件:
# -*- coding: utf-8 -*-
import sys
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。
汇总下验证结果,可以得到如下的表格:
总结下结论:如果使用 Python2 请一定要使用 gbk 格式存储文件;
如果使用 Python2 尽可能使用 gbk 存储文件且显式声明脚本文件编码为 gbk,方便后续兼容 Python3;
如果使用 Python3 不管使用什么格式存储文件,但请一定保证显式声明脚本文件编码和存储格式一致;
不管是使用 Python2 还是 Python3,保持显式声明脚本文件编码的好习惯;
如果脚本有跨平台需求,推荐使用 Python3 + 脚本文件编码 utf-8 + utf-8 格式存储文件的组合;
python编码规范utf8还是gbk还是ask_彻底搞懂 Python 编码相关推荐
- python class用法理解_Python小世界:彻底搞懂Python一切皆对象!
犹记得当初学习Python的时候,对于 Python一切皆对象 很是懵逼,因为Python是面向对象的动态型语言,而在函数及高阶函数的应用中,如若对于一切皆对象不是有很透彻的了解,基础不是那么牢固的话 ...
- python中的dict函数什么意思_3分钟搞懂Python中dict函数的含义是什么
Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度. 举个例子,假设要根据同学的名字查找对应的 ...
- python中row是什么意思_一文搞懂Python中的yield
关注公众号「Python七号」,及时 get Python 技能. yield 可以实现生成器,可以实现协程. 什么是生成器,什么是协程,如果还不了解,可以继续往下看,概念可以不懂,只要理解它的作用和 ...
- python中w和wb区别_一篇搞懂python文件讀寫操作(r/r+/rb/w/w+/wb/a/a+/ab)
關於文件操作的幾種常用方式,網上已有很多解說,內容很豐富,但也因此有些雜亂復雜.今天,我就以我個人的學習經驗寫一篇詳細又易懂的總結文章,希望大家看完之后會有所收獲. 一.各模式逐個分解 'r':只讀. ...
- python中w和wb区别_一篇搞懂python文件读写操作(r/r+/rb/w/w+/wb/a/a+/ab)
关于文件操作的几种常用方式,网上已有很多解说,内容很丰富,但也因此有些杂乱复杂.今天,我就以我个人的学习经验写一篇详细又易懂的总结文章,希望大家看完之后会有所收获. 一.各模式逐个分解 'r':只读. ...
- python中gbk字符原因报错_不想再被鄙视?那就看进来! 一文搞懂 Python 2 字符编码...
原标题:不想再被鄙视?那就看进来! 一文搞懂 Python 2 字符编码 程序员都自视清高,觉得自己是创造者,经常鄙视不太懂技术的产品或者QA.可悲的是,程序员之间也相互鄙视,程序员的鄙视链流传甚广, ...
- 彻底搞懂 字符 编码 GBK 和 UTF8
转:彻底搞懂编码GBK和UTF8 彻底搞懂编码 GBK 和 UTF8 常用编码格式一览 首先来看一下常用的编码有哪些,截图自Notepad++.其中ANSI在中国大陆即为GBK(以前是GB2312), ...
- Qt 字符编码转换(UTF-8 转换为 GBK) \u7528\u6237\u672a\u7b7e\u7ea6
UTF-8 转换为 GBK \u7528\u6237\u672a\u7b7e\u7ea6 编码知识(\u7528\u6237\等的就是Unicode编码) 转换编码示例 编码知识(\u7528\u62 ...
- 一文搞懂 Python 的 import 机制
一.前言 希望能够让读者一文搞懂 Python 的 import 机制 1.什么是 import 机制? 通常来讲,在一段 Python 代码中去执行引用另一个模块中的代码,就需要使用 Python ...
最新文章
- 全文搜索引擎选 ElasticSearch 还是 Solr
- 浅谈机房内的汇流铜排
- 1.1.2 操作系统的特征(并发、共享、虚拟、异步)
- 【Opencv-Ubuntu】论clone对Mat的重要性
- iphone电压测试软件,App Store 上的“ECG Test Pro”
- 关于很多人 年底被炒!
- 动态规划入门(一)——数字三角形
- 春节档总票房已破50亿 情人节单日票房超14亿
- 可自定义匹配规则查找控件_懂Excel轻松入门Python数据分析包pandas(二十八):二分法查找...
- Groovy操纵集合秘籍
- 推一个知乎学弱猹的公众号
- 权限梳理_请梳理头发,擦鼻子-我单身父亲的月
- Java –显示所有ZoneId及其UTC偏移量
- wjw的剪纸(DFS)
- 【离散数学】代数系统,半群,独异点(幺半群),群,可交换群(Abel群)之间的关系
- java ftp上传文件内容为空
- java的OpenGL学习资料
- 自学篇之如何高效地学习网络安全
- 链式存储【C语言单链表】
- setting配置文件
热门文章
- python合并列表重新排序_python实现的合并两个排序的列表
- 对Hibernate赖加载对象在session容器之外的获取方法
- 如何在服务器上部署pdf文件,详解如何在云服务器上部署Laravel.pdf
- 大学c语言下上机考试题,计算机考试二级C语言上机试题下[5]
- Governing sand(权值线段树/主席树)
- 青岛理工邀请赛(难受的一次经历)之显示屏(按着倍数放大数字)
- 用c写按键精灵脚本语言,按键精灵之插件编写
- com.alibaba.druid.pool.DruidDataSource.error解决办法
- python middleware_Sanic middleware – 中间件
- python跳转到新页面、如何等待页面加载完_python urllib2 – 在抓取之前等待页面完成加载/重定向?...