代码运行的时候,加载到内存,有一个Python平台的编码类型;
打印输出到屏幕的时候,有个屏幕的编码类型;
默认的Python2.7用的是ascii的编码类型,在不做任何代码文件声明的时候,Python平台,把代码文件当做ascii编码类型的文件直接加载。
可想而知,当代码文件中存在非ascii编码的字符的时候,肯定报错,识别不了。如果是用数字表示的编码,就不会报错。
当在代码文件的开头加上声明如:“#-*-coding:utf8-*-”的编码声明的时候,Python平台就会按照utf8的编码格式来理解源代码文件,并解释到Python平台的ascii编码。这里应当注意,原代码文件声明为utf8编码,则其文件,就应当按照utf8的格式来存储,不然就成挂羊头卖狗肉了。Python平台一样不会做出正确的理解。
第一种情况 所有的编码都采用utf8的时候
1、设置cmd编码格式为utf8,并设置字体。
命令为:chcp 65001
2、代码文件如下
#-*-coding:utf8-*-
str1 = '人生苦短'
print '#' + str1
3、将代码文件保存为utf8格式。
源代码的编码声明格式,源代码的保存编码格式,Python平台的编码格式,cmd的显示编码格式,这几着如果不一致都会导致显示有问题。
举几个例子。
第二种情况 其他编码都不变,将cmd的编码改为gbk,也就是936
1、设置cmd编码格式为gbk
命令为:chcp 936
2、测试如下代码
#-*-coding:utf8-*-
str1 = '人生苦短'
print '#' + str1
print '#' + str1.decode('utf8').encode('gbk')
第二个打印语句能够正确的显示,gbk只是针对的中文的编码,因此cmd的显示编码范围是utf8的一个子集,因而第一个打印语句不能正确的显示。
由于原代码文件以utf8存储,并且声明为utf8的编码格式,因此Python平台将其按照utf8格式翻译为平台所需的ascii格式进行程序的调用。
str1是str对象,其字节序列是utf8格式的,而cmd要正确显示所需要的是gbk格式的字节序列。因此做如下的转换:
str1 经解码变为utf8格式的unicode对象,
utf8格式的unicode对象经gbk格式的编码转换为gbk格式的字节序列。
最后输出就能正确显示。
再看一种情况,这种情况比较有意思:
1、cmd编码格式设置:chcp 936
2、代码的存储格式为
#-*-coding:windows-1252-*-
str1 = 'ÈËÉú¿à¶Ì'
str2 = u'ÈËÉú¿à¶Ì'
print '#' + str1
print [str2]
print '#' + str2.encode('windows-1252')
执行后,依然能够正确的额打印输出。为什么?