python2.7 编码问题解析(二)

代码文件的存储,有一个编码类型;
代码运行的时候,加载到内存,有一个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')

 

执行后,依然能够正确的额打印输出。为什么?




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值