在py2中,编码是一个几乎伴随始终的问题。
一、.py 文件编译的原理和步骤(对于文件中字符而言):
python编译器在解释 .py 文件前,对文件中的字符处理分为以下几个步骤:
1、读出py文件内容
2、将读出的内容根据文件编码转换为Unicode编码(Unicode成为中间编码)
3、分词标注
4、解释它。对于原本就是Unicode的字符,创建一个Unicode对象;对于原来是str的字符,将会从Unicode按照文件编码再编码为str对象。
对于以上4个步骤,有几点说明:
1、python中的文件编码可以由程序员自由指定(#coding=字符编码)
2、若没有指定,则默认为ASCII编码
3、异常是如何出现的:
举个例子,如果你的文件中包含了UTF-8的编码方式。
正常的步骤是,读入文件,将文件中的字符由UTF-8解码为unicode,然后再将unicode编码为UTF-8。
// 但如果没有将文件的编码方式指定为(#coding=UTF-8),当进行上述第二步和第四步时,编译器将会使用python中默认的ASCII进行编码和解码。于是异常出现。
4、对于str对象和Unicode对象,在下面详细介绍。
二、str和Unicode对象
1、python中一切皆对象。字符对象分为两种,一种是Unicode对象,一种是str对象
2、python中的字符是以Unicode为基础的(即Unicode作为中间编码存在)
3、str是字符串对象,但是可以有很多种不同的编码,如UTF-8,GBK等
4、不同编码方式的str对象,不可以直接转换,必须通过Unicode作为中间编码进行转换。
例如:若要将UTF-8转换为GBK,首先将UTF-8解码(decode)为Unicode,然后再将Unicode编码(encode)为GBK。
5、关于编码和解码:
编码:encode
解码:decode
其实编码和解码也是以Unicode编码为基础来讨论的。由于python中以Unicode作为中间(基础)编码存在,所以由str转换为基础编码称为解码,而由基础编码转换为str称为编码。
6、python中许多函数和命令,接受Unicode编码方式。在使用这些函数或者命令时,必须确保所涉及到的字符串的编码方式为Unicode。例如:
python2.7中的print语句,接受Unicode编码方式。
<span style="font-size:18px;">#coding=utf-8
s = '郝'
print s
//输出结果为 閮�</span>
<span style="font-size:18px;">
********************************
</span>
<span style="font-size:18px;">#coding=utf-8
s = '郝'
s = s.decode('utf-8')
print s
//输出结果为 郝 </span>
三、处理python2中编码问题的原则:
明确编码,同类交互,计算机认Unicode(py中大部分情况)
**************************************************************************
接下来看看python中涉及到字符编码的一些实际操作吧