Python中的默认编码

####1. python源代码文件的执行过程
我们都知道,磁盘上的文件都是以二进制格式存放的,其中文本文件都是以某种特定编码的字节形式存放的。对于程序源代码文件的字符编码是由编辑器指定的,比如我们使用pycharm来编写python程序时会指定工程编码和文件编码为utf-8,那么python代码被保存到磁盘时就会被转换为utf-8编码对应的字节(encode过程)后写入磁盘。当执行python代码文件中的代码时,python解释器在读取python代码文件中的字节串之后,需要将其转换为unicode字符串(decode过程)之后才执行后续操作。
上面已经解释过,这个转换过程(decode,解码)需要我们指定文件中保存的字节使用的字符编码是什么,才能知道这些字节在unicode这张万国码和统一码中找到其对应的代码点是什么。这里指定字符编码的方式大家都很熟悉,如下所示:
# -*- coding:utf-8 -*-
2. 默认编码那么,如果我们没有在代码文件开始的部分指定字符编码,python解释器就会使用哪种字符编码把从代码文件中读取到的字节转换为unicode代码点呢?就像我们配置某些软件时,有很多默认选项一样,需要在python解释器内部设置默认的字符编码来解决这个问题,这就是文章开头所说的“默认编码”。因此大家所说的python中文字符问题就可以总结为一句话: 当无法通过默认的字符编码对字节进行转换时,就会出现解码错误(unicodeencodeerror) 。
python2和python3的解释器使用的默认编码是不一样的,我们可以通过sys.getdefaultencoding()来获取默认编码:
>> > # python2 >> > import sys >> > sys.getdefaultencoding()'ascii' >> > # python3 >> > import sys >> > sys.getdefaultencoding()'utf-8'因此,对于python2来讲,python解释器在读取到中文字符的字节码尝试解码操作时,会先查看当前代码文件头部是否有指明当前代码文件中保存的字节码对应的字符编码是什么。如果没有指定则使用默认字符编码ascii进行解码导致解码失败,导致如下错误:
syntaxerror: non-ascii character '\\xc4' in file xxx.py on line 11, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details对于python3来讲,执行过程是一样的,只是python3的解释器以utf-8作为默认编码,但是这并不表示可以完全兼容中文问题。比如我们在windows上进行开发时,python工程及代码文件都使用的是默认的gbk编码,也就是说python代码文件是被转换成gbk格式的字节码保存到磁盘中的。python3的解释器执行该代码文件时,试图用utf-8进行解码操作时,同样会解码失败,导致如下错误:
syntaxerror: non-utf-8 code starting with '\\xc4' in file xxx.py on line 11, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details3. 最佳实践创建一个工程之后先确认该工程的字符编码是否已经设置为utf-8为了兼容python2和python3,在代码头部声明字符编码:-*- coding:utf-8 -*-

AI时代将助力智慧医疗改变行业现状
未来5年智能手表年复合增长率达到11%
华为新一代“万元神机”——Mate 20 RS保时捷设计设计正式首发开售
全栈工程师真的不全栈
普洛帝OPC-III油液综合监测系统在工程机械行业的应用介绍
Python中的默认编码
过去几个月,他们把数字化融进了中国经济的毛细血管
加密货币不言底 离得越远越好
中移物联采购600万台M5330-A车载通信模块,全力着手车联网市场
小米6或于4月11发布,全系骁龙835+陶瓷尊享版+两版本,货量充足不抢购?
运算放大器供电过压保护电路图
五大焊接机器人品牌介绍
面试常问的16个C语言问题
国际能源署:全球电动汽车数量2年内将猛增300%
西门子精简二代触摸屏做动画效果
Waymo推出真正的无人驾驶共享汽车服务
格力推出新手机,资金却砸盘超9亿元
华为智能安防正式更名为“机器视觉”
安谋中国:PSA认证推动物联网安全变革
cbb20和cbb22通用吗