Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 735|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-7-20 09:18:11 | 显示全部楼层 |阅读模式

    背景

    自动化测试调用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就好 

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-30 00:11 , Processed in 0.110203 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表