首先,我们先让大家看一下python解析器的全流程:
我们编辑器编写好源代码->保存成文件。如果源代码中有编码声明而且用的编辑器支持该语法,那么该文件就以相应的编码方式保存在磁盘中。
注意:编码声明和源文件的编码不一定是一致的,你完全可以在编码声明中声明编码为utf-8,但是用GB2312来保存源文件。当然,我们不可能自寻烦恼,故意写错,而且,好的IDE也能强制保证两者的一致性,但是,如果我们用记事本或者editplus等编辑器来编写代码的话,一不小心就会出现这种问题的。
得到一个.py文件后,我们就可以运行它了,这时,我们就把代码交给python解析器来完成解析工作。
解析器读入文件时,先解析文件中的编码声明,我们假设文件的编码声明为GB2312,那么解析器会先将文件中的内容由GB2312转换成Unicode,然后再把这些Unicode转换成utf-8格式的字符串。
注意:这里仅指源代码即脚本代码的纯代码转换,完成这一步骤后,解析器把这些utf-8字符串分段,解析。如果遇到使用unicode字符串(如,u‘中国a我爱你’)那么就使用相应的utf-8字符串创建unicode字符串。
如果程序中使用的是一般的字符串,那么,解析器先将utf-8字符串通过unicode转换成相应的编码(这里也就是gb2312)的字符串,并用其创建一半的字符串对象,也就是说,unicode字符串根一般字符串在内存中的存放格式是不一样的,前者是用utf-8的格式,后者是用gb2312的格式。(注:普通的,非unicode的,即ascii)
好了,内存中的字符串格式我们知道了,下面我们要了解print的工作方式,print其实是负责把内存中相应的字符串交给操作系统,让操作系统相应的程序,比如cmd窗口进行展示,这里有两种情况:
1、若字符串是一般的字符串,那么print只需要把内存中相应的字符串推送给操作系统。
2、如果字符串是unicode字符串,那么print在推送之前先进行相应的encode,我们可以显示使用unicode的encode方式使用合适的编码来编码。
【链接】浅析Python解析器解析全过程:http://www.th7.cn/Program/Python/201508/548091.shtml