python 中文乱码

1,print 函数打印时,乱码的处理就交给了,os来做,只负责发送字符串给它。?(看来不是,因为python 在print 时自动读取。sys.stdout.encoding 属性值,自动进行编码)

还有,utf-8 和 gkb等等之间相互转换,只需python 存贮了各自的编码规则,按照该规则编码,解码都可以,不是什么大事,麻烦事,只是转的时候,ascii 范围很小,发现很多字符没有对应,所以会抛出错误。

python 中字符串,分为两种,一种是unicode的s=u'哈哈',另外一种是 s = '哈哈',该种已经按照python encoding 的属性,进行了编码?

2,本质上不变的是,按各种的存储方式,在内存中真是的编码方式,如果是utf-8,每个中文就会存三个字节\x12\x23\xe4,如果是unicode每个汉字就占2个字节16位\u23412\u234e

1 import sys
2 print sys.getdefaultencoding()
3 # 'ascii'

 

解决的方案很简单,修改默认的编码模式,很多朋友会想到setdefaultencoding,是的,我们可以通过sys.setdefaultencoding(‘utf-8′)来将当前的字符处理模式修改为utf-8编码模式,值得注意的是,如果单纯这么调用的话,Python会抛出一个AttributeError异常:基本上是ascii编码方式,由此Python自然调用ascii编码解码程序去处理字符流,当字符流不属于ascii范围内,就会抛出异常(ordinal not in range(128))。

1 Traceback (most recent call last):
2   File "<stdin>", line 1, in <module>
3 AttributeError: 'module' object has no attribute 'setdefaultencoding'

 

竟然说sys没有setdefaultencoding的方法,其实sys是有这个方法的,但是要请出她老人家需要调
用一次reload(sys),?如果有谁知道原因的话,还望不吝赐教。
 
1 import sys
2 reload(sys)
3 sys.setdefaultencoding('utf-8')

 

import sys 

print 'default encoding: ' , sys.getdefaultencoding()
print 'file system encoding: ' , sys.getfilesystemencoding()
print 'stdout encoding: ' , sys.stdout.encoding
print u'u"中文" is unicode: ', isinstance(u'中文',unicode)
print u'"中文" is unicode: ', isinstance('中文',unicode) 

 

看输出结果,注意下列事实:

python系统缺省的编码格式为ASCII,这个缺省编码在Python转换字符串时用的到,这里给两个例子:

1. a = "abc" + u"bcd", Python会如此转换"abc".decode(sys.getdefaultencoding()) 然后将两个Unicode字符合并。

2. print unicode('中文') , 这句话执行会出错“UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 …”,是因为Python试图用缺省编码来编码,而这个字符串不是ASCII,因此需要显示的指出,如果你的文件源类型为utf-8,则应如此:print unicode('中文','utf-8’)

Windows下getfilesystemencoding输出mbcs(多字节编码,windows的mbcs,也就是ansi,它会在不同语言的windows中使用不同的编码,在中文的windows中就是gb系列的编码)

Windows下控制台编码为cp936, 当你打印东西到控制台时Python自动做了转换。这里会引发一个有趣的问题, 试一下这个简单的例子test.py:

在控制台中分别运行 python test.py 和 python test.py > 1.txt

你会发现后者会报错,原因是打印控制台时Python会自动转换编码到sys.stdout.encoding, 而输出到文件时Python不会自动在write调用中进行内部字符转换。这个问题在PrintFails中有较详细的说明。

posted on 2013-03-25 11:45  Harveyaot  阅读(731)  评论(0编辑  收藏  举报

导航