【Python】“UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9”根因及解决方法

背景

自动化测试调用HTMLTestRunner生成测试报告的时候,出现了编码错误,错误如题

原因

搜索了很多资料,得出的结论是python的str默认是ascii编码,和unicode编码冲突,就会报这个错误

解决方法

网上的资料推荐在代码中加上如下几句可以解决这个问题:

1 import sys
2 reload(sys)
3 sys.setdefaultencoding('utf8')

深入

博主在后来又遇到过多次编码错误,最常遇到的就是下面这个:

“UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)“

后来学习了unicode和utf-8相关的内容,慢慢的对这一块有了一定的认识:

unicode指的是万国码 是一种"字码表" 而utf-8是这种字码表储存的编码方法,编成bytecode储存,unicode还可以编码utf-16,utf-7等其他方式 

Python中字符串类型分为两种型态:byte string、unicode string Python脚本顶部设定了“ #coding=utf-8”后所有带有中文的都会被宣告为utf-8的byte string,但是,在函数中所产生的字符串,又会是unicode string。其实两者都能表示中文,但是不代表能够混用,混用就会出错

例如:

response.out.write("你好"+request.get("argu"))

中文字符“你好”会被宣告为byte string,而request.get()的结果是unicode string

Python会自动常识吧前面的“你好”转为unicode

但是预设的解码器是ascii,所以转换不出来,就报了上面的错误。

一劳永逸的方法

综上所述,一劳永逸的解决的方法有3种

全部转为byte string  (response.out.write("你好"+request.get("argu").encode('utf-8')))
全部转为unicode string (response.out.write(u"你好"+request.get("argu")))
更改设定预设解码器为utf-8

P.S.资料库存入和读取以及request拿到的参数预设就都是unicode string,若是要把byte string转unicode string可以这样转unicode(unicodestring,"utf-8")

这样就再也不会有"UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)"的问题产生了 遇到喷出这种错误几乎都可以用这2种方法解决

我个人是觉得用第一种全都转byte string比较好

因为一但用了unicode string 以后有中文字串前面都要挂个u 看起来不是很直觉 而且容易漏掉

不如在遇到函式有中文结果(或是资料库捞出来的结果)直接都encode成utf-8就好 

转载于:https://www.cnblogs.com/Detector/p/6937397.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值