python #coding 和 setdefaultencoding的区别

文件格式、处理格式、控制台输出格式,三个任何一个不一致都会乱码;

如果print的是u串,python会自动转换成跟控制台格式一致;

 

 
61 posts
其实问题首先要弄清楚s='中文'   之后s的编码格式。
#coding:utf-8
s='中文'
此时s为:'\xe4\xb8\xad\xe6\x96\x87'(utf8编码)

#coding:gbk
s='中文'
此时s为:'\xd6\xd0\xce\xc4'(gbk编码)
 
#coding:gbk
import sys
reload(sys)
sys.setdefaultencoding('utf8')
s='中文'
此时s为:'\xd6\xd0\xce\xc4'
 
#coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('gbk')
s='中文'
此时s为:'\xe4\xb8\xad\xe6\x96\x87'
 
 
综上,s='中文'保存的编码格式由#coding即文件的保存格式确定。
py文件默认是ASCII编码,可以由sys.getdefaultencoding()获得。
使用print输出时,python会做一个ASCII到系统默认编码的转换。
对 于中文系统来说,默认的是gbk,隐式转换时,是从代码文件编码格式转换成gbk,默认是ASCII->GBK。
如果字符串编码不是ASCII,则 隐式转换会出错,需要显式转换,你#coding gbk之后不乱码,是因为gbk是win系统默认格式,print时候省略了转换过程,如果你将
#coding:utf-8
import sys
import chardet
reload(sys)
sys.setdefaultencoding('gbk')
s='中文'
print s
print chardet.detect(s)['encoding']
放在非中文系统中打印,应该是乱码。
我的测试方法是打印
#coding:shift_jis
import sys
print sys.getdefaultencoding()
reload(sys)
sys.setdefaultencoding('shift_jis')
print sys.getdefaultencoding()
s='その他'
print s
结果为乱码。
我对python不熟悉,idle的调试功能今天也是第一次用,只能猜测到这么多。
有高人的话请指教。
如果你只是使用需要,print前手动decode。如果是理解需要,看完还不明白自己再调试一下吧。
posted @ 2013-08-25 23:01  springbarley  阅读(1931)  评论(0编辑  收藏  举报