我就想不通为什么windows的字符终端用的是cp936而不是utf-8。不过要是他用的是utf-8,那我也没什么博文好写了==于是本菜鸟总结了一下,和广大python菜鸟分享。
当然如果你全部只用英文或数字,那我又没什么博文好写了wwww
当你的脚本在字符终端出现乱码或错误时,按以下办法自检:
- 打印的字符是中文字,但是都是没学过o(╯□╰)o:使用了utf-8编码(encode),字符终端代码页是gbk
- 打印出的都是“�åȡ��”:你使用了gbk或其他的编码,而终端使用的是utf-8
一般来说:
- 网页使用utf-8编码较多(听说以前百度是用的gb2312?),做爬虫并要打印在屏幕上时,要对原始数据做utf-8解码(decode)处理
- windows下的大部分文本文件是ANSI编码,读取文件并打屏幕上时做cp936解码
我一般是这么解决的:
- 【必须】在脚本开头加入以下代码,为使内部编解码的“中间过程”不使用ascii 解码器。防止出现’ ‘ascii’ codec can’t decode/encode byte 0x99 in position 4-6’
1 2 3 |
import sys reload(sys) sys.setdefaultencoding('utf-8') |
- 写一个“规范化字符串”用的函数,这样得到的字符串可直接用于打印,且因为有errors处理,不会出现‘‘gbk’ codec cannot decode/encode byte 0x99 in position xxx’的错误(第二个参数指定error处理,可选有’ignore’丢弃, ‘replace’用?代替)
1 2 3 4 5 |
def normstr(str,errors='ignore'): if sys.platform=='win32':#若windows return str.encode('gbk',errors)#更好的办法是用cp936,因为它支持一些繁体字 else: return str.encode('utf-8',errors) |
- 在脚本开头加入编码定义语句。当然你不怕死也可以用gbk
1 |
# -*- coding:utf-8 -*- |
这样之后,在代码中如果出现
1 |
print('尼玛') |
之类的语句时,需要在字符串后面加上.decode(‘utf-8’)变成
1 |
print('尼玛'.decode('utf-8')) |
因为你的代码是utf-8编码的
- 如果你和我一样用的是pydev+eclipse写的代码,为了方便windows环境调试起见,可以把控制台的编码改成和windows一样挫的gbk。方法是:Run->Run configuration->Common->Encoding->Others填入GBK或者cp936
写完了~真开森~
参考资料:
http://hi.baidu.com/mdj_hu/item/4d7d0803d38e62e1fe240de4
http://www.jb51.net/article/26543.htm(不推荐,看完晕过去)