python#coding:utf-8和setdefaultencoding有什么区别?

经常会碰到这样的错误

错误一

错误二

大家解决的方案如下

为什么在首行定义了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,所以使用方案二可以将这种情况避免。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180120G004TQ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券