◆ 编码声明:
# -- coding: utf-8 --
必须放在python文件的第一行或第二行,是用来指定文件的编码为 utf-8 的。(python 3.0以后默认就用utf-8,无需再做编码声明)
如果没有此文件编码类型的声明,则 python 默认以ASCII编码去处理;如果你没声明编码,但是文件中又包含非ASCII编码的字符的话,python解析器去解析的 python 文件,自然就会报错了。
支持的格式,可以有三种:
★ 带等于号的:# coding=<encoding name>
★ 最常见的,带冒号的(大多数编辑器都可以正确识别的):
#!/usr/bin/python
# -*- coding: <encoding name> -*-
★ vim的:
#!/usr/bin/python
# vim: set fileencoding=<encoding name> :
◆ python文件编码声明所遵循的理念:
1.单个的完整的python源码文件中,只用单一的编码。
不允许嵌入了多种的编码的数据,否则会导致(python解释器去解析你的python文件时)报编码错误。
2.Python的分词器+编译器,会按照如下的逻辑去工作:
读取文件
不同的文件,根据其声明的编码去解析为Unicode
转换为UTF-8字符串
针对UTF-8字符串,去分词
编译之,创建Unicode对象
要注意的是:Python中的标识符,都是ASCII的。
◆ 关于python的编码:
字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。
1、 pyhton的所有内置库、方法接受的是unicode编码的字符串。
2、str.decode 函数就是转成unicode编码,所以能decode的字符串传级python的内置库、函数都能正确运行。
3、问题在于这个decode函数解码时到底要传哪个参数:utf-8,gbk,gb2312......等N种编码。参数不当,就会抛类似异常:
UnicodeDecodeError: 'gbk' codec can't decode bytes in position 2-3: illegal multibyte sequence
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 0-1: invalid data
如果字符串是这样定义:s=u’中文’,则该字符串的编码就被指定为unicode了,即python的内部编码,而与代码文件本身的编码无关。因此,对于这种情况做编码转换,只需要直接使用encode方法将其转换成指定编码即可。
◆ 获得系统的默认编码
#!/usr/bin/env python
#coding=utf-8
import sys
print sys.getdefaultencoding()
在某些IDE中,字符串的输出总是出现乱码,甚至错误,其实是由于IDE的结果输出控制台自身不能显示字符串的编码,而不是程序本身的问题。
print s.encode('utf8'),若输出:\xe4\xb8\xad\xe6\x96\x87,这是控制台信息输出窗口按照ascii编码输出utf8编码的字符串的结果。
◆ unicode函数:
unicode(str,'gb2312')与str.decode('gb2312')是一样的,都是将gb2312编码的str转为unicode编码
◆ 编码处理参考脚本:
#!/usr/bin/env python
#coding=utf-8
s="中文"
if isinstance(s, unicode):
#s=u"中文"
print s.encode('gb2312')
else:
#s="中文"
print s.decode('utf-8').encode('gb2312')