python2中的编码问题

2017-04-11  本文已影响0人  掀开绿罗裙

最近爬js渲染网页,提取json格式内容的时候。忽然发现写入本地时内容全是带‘u'的字符串码,print输出依然是带u的串码,encode(“utf-8”),则会报UnicodeEncodeError: 'ascii' codec can't encode characters in position 15-16: ordinal not in range(128)错误

网上看相关的blog,发下大家都是

import sys

reload(sys)

sys.setdefaultencoding("utf-8")

这样强制将系统默认编码格式转换成utf-8确实能解决print的问题。

但是,写入文件还是不行。

再有,在百度知道上看到有人修改python安装目录下lib文件夹下的site.py,我觉得这样更加得不偿失。

于是疯狂在网上搜索找答案,终于在stackoverflow上看到相似的问题。回答者说,出现这个问题的主要原因是python解释器默认是asiic编码,如果要在print上输出,则需解码成unicode。还建议提问者去看howto unicode官方文档。

于是我上车看howto unicode。

文档是这样说的:

原来,解释器默认编码都是asiic,如果使用print输出特殊编码的字符,则需要先将编码解码成unicode,这样解释器print的时候会自动将编码转换成合适的编码格式。

如果要写入文件,那要先解码unicode,在编码成UTF-8

如:

>>>a="\u8d1f\u8d23\u4eba"

>>>a

>>>'\\u8d1f\\u8d23\\u4eba'

>>>print a

>>>\u8d1f\u8d23\u4eba

>>>>>> a=a.decode("unicode-escape")#反编码成unicode码

>>> a

u'\u8d1f\u8d23\u4eba'

>>> print a

负责人

print 输出的时候会自动解码

但是当我们要写入文件的时候呢

>>> fname="test.txt"

>>> f=open(fname,'w')

>>> f.write(a)

Traceback (most recent call last):  File "", line 1, inf.write(a)

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-11: ordinal not in range(128

这时就需要先转码了

>>> f.write(a.encode("utf-8"))

查看文件写入的内容:

上一篇 下一篇

猜你喜欢

热点阅读