目录
- 前言
- 声明文件头
- 通过sys模块修改默认编码
- 一劳永逸的修改默认编码
前言
由于Python 2.x默认编码是ASCII。由此也带来了一系列问题,比如加个中文注释什么的就会报错:
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
这个时候,我们可以有以下几种办法来处理这个问题。
声明文件头
在文件头部设置:
# -*- coding: utf-8 -*- # 推荐
# coding=utf-8 # 不推荐
# coding:utf-8 # 不推荐
上述三种声明方式任选一种,但推荐第一种。
声明文件头就是在告诉Python 2.x解释器以我声明的编码方式解码。当然了,如果全文都是ASCII编码的文件这个声明一般没用,只是针对文件内有非ASCII编码的字符(变量或注释)才有用,但是这并不是万事大吉的,能不能正常运行通常也根据该文件存储时的编码有关。我们知道不同的编码方式,在硬盘上存储的字节流也是不同的。比如:
s = "函数"
以GBK
和utf-8
两种编码方式在硬盘上会这样保存:
编码 | 字节流 |
GBK | 73 20 3D 20 22 BA AF CA FD 22 |
UTF-8 | 73 20 3D 20 22 E5 87 BD E6 95 B0 22 |
为了防止乱码,我们一直强调,文件以什么编码方式保存,就以什么编码方式读取。
通过sys模块修改默认编码
除了声明文件头,我们还可以通过sys
模块来修改默认编码:
# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
由于sys模块是在Python解释器启动时就加载了,所以,我们必须reload
重新加载,才能手动设置编码方式。但是这么设置并非永久的,而是仅应用于本模块中。
一劳永逸的修改默认编码
我们在Python解释器安装目录的Lib\site-packages
目录中新建一个名为sitecustomize.py
文件。文件内容为:
# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
这样的话,在解释器启动时,就会自动去读取该文件,在解释器真正工作之前,我们就把默认编码修改了(Python 2.4版本测试毫无问题)。
这就是一劳永逸的解决办法。大家可以视情况而定,选择什么办法。
一般地,都是声明文件头就行了。因为就目前而言,采用utf-8
编码的软件越来越多,并且都可以自定义编码方式。所以,拥抱utf-8
吧!