经常会碰到这样的错误
错误一
错误二
大家解决的方案如下
为什么在首行定义了utf-8,还要用sys再set一次?
第一行那个不是代码,不会执行的,只影响Python解释器读取源文件时候使用的编码。比如你在代码里面写了’中文’这样的字符串,默认是读不出来的,因为不是ascii字符,所以要指定文件编码是utf-8(当然文件也要用utf-8格式保存)。等读到内存里变成’\xe4\xb8\xad\xe6\x96\x87’之后就没有区别了。 下面那个设置的是Python运行时的字符默认编码,完全是另一回事。Python2.x为了兼容处理Unicode字符串(unicode)和ANSI字符串str,某些时候会自动做两者的转换,但默认使用的是ASCII字符编码,如果有utf-8字符在里面就会出错。这个hack是修改这个默认特性。非常不建议这么做,你应该永远分清str(bytes)和unicode,然后自己调用encode、decode来转换。Python3.x下这两个类型已经不兼容了。
解释
str是字节串,由unicode经过编码(encode)后的字节组成的
str -> decode(‘the_coding_of_str’) -> unicode
unicode -> encode(‘the_coding_you_want’) -> str
unicide 是所有编码都认可的编码,但是就是使用了4个字符,32位来表示世界上所有的字符,因为过于浪费,所以python中一般会采用自己定义的一种编码方式,默认为ascll。
但ascll只支持英文,遇到中文就会发生错误。所以我们一般用以下两种方案来使得python运行中支持中文。
1.在文件头部加上
方案一:仅支持编译过程中将指定中文的字符串用 utf-8 来处理
s =‘中文’
这就默认Python在编译程序的时候就已经把中文从unicode 转为了str
上面的data就是网页的页面内容,我们知道,有些网页的内容不一定都是由utf-8编码的
所以采用chardit1[‘encoding’] 获得返回网页的response的编码。知道这个编码才能把str正确地转为unicode
方案二:支持在运行过程中将unicode转为str
有些python封装好的函数,函数的参数就是unicode,函数内部会把unicode转str,此时就会使用到系统默认的str编码格式ascll,所以使用方案二可以将这种情况避免。
领取专属 10元无门槛券
私享最新 技术干货