Skip to content

前言

由于Python 2.x默认编码是ASCII。由此也带来了一系列问题,比如加个中文注释什么的就会报错:

python
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128
SyntaxError: Non-ASCII character '\xe5' in file M:/demo.py on line 7, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

这个时候,我们可以有以下几种办法来处理这个问题。

声明文件头

在文件头部设置:

python
# -*- coding: utf-8 -*-	  # 推荐
# coding=utf-8		# 不推荐
# coding:utf-8	# 不推荐

上述三种声明方式任选一种,但推荐第一种。

声明文件头就是在告诉Python 2.x解释器以我声明的编码方式解码。当然了,如果全文都是ASCII编码的文件这个声明一般没用,只是针对文件内有非ASCII编码的字符(变量或注释)才有用,但是这并不是万事大吉的,能不能正常运行通常也根据该文件存储时的编码有关。我们知道不同的编码方式,在硬盘上存储的字节流也是不同的。比如:

python
s = "函数"

GBKutf-8两种编码方式在硬盘上会这样保存:

编码字节流
GBK73 20 3D 20 22 BA AF CA FD 22
UTF-873 20 3D 20 22 E5 87 BD E6 95 B0 22

为了防止乱码,我们一直强调,文件以什么编码方式保存,就以什么编码方式读取。

通过sys模块修改默认编码

除了声明文件头,我们还可以通过sys模块来修改默认编码:

python
# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

由于sys模块是在Python解释器启动时就加载了,所以,我们必须reload重新加载,才能手动设置编码方式。但是这么设置并非永久的,而是仅应用于本模块中。

一劳永逸的修改默认编码

我们在Python解释器安装目录的Lib\site-packages目录中新建一个名为sitecustomize.py文件。文件内容为:

python
# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

这样的话,在解释器启动时,就会自动去读取该文件,在解释器真正工作之前,我们就把默认编码修改了(Python 2.4版本测试毫无问题)。 这就是一劳永逸的解决办法。大家可以视情况而定,选择什么办法。 一般地,都是声明文件头就行了。因为就目前而言,采用utf-8编码的软件越来越多,并且都可以自定义编码方式。所以,拥抱utf-8吧!


see also:[Python2 设置系统默认编码](https://blog.csdn.net/study_000/article/details/72673655) | [Python文件头注释的含义](https://blog.csdn.net/SeedJYH/article/details/81739115) | [PEP 263](https://python.org/dev/peps/pep-0263/) | [解决Python2中文ascii编码的方法](https://qq52o.me/2639.html) 欢迎斧正,that's all