最近爬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"))
查看文件写入的内容:
网友评论