背景

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

【Python】“UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9”根因及解决方法的更多相关文章

  1. Python报错“UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128)”的解决办法

    最近在用Python处理中文字符串时,报出了如下错误: UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 0: ...

  2. UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128) 解决办法

    最近在用Python处理中文字符串时,报出了如下错误: UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 0: ...

  3. python2 当中 遇到 UnicodeDecodeError UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 37: ordinal not in range(128)

    使用python2 总是遇到 UnicodeDecodeErrorUnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in positio ...

  4. python UnicodeDecodeError: 'ascii' codec can't decode byte 0xa6 in position 907: ordinal not in range(128)

    import sysreload(sys)sys.setdefaultencoding('utf-8')

  5. python:UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xef in position xxx: ordinal not in range(128)

    执行sql_cmd = "select * from item_base where item_id in " + item_ids_str时报错 solve: import sy ...

  6. 【Python】【解决】UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 1: ordinal not in range(128)

    1.问题描述 今天在升级Ubuntu到14.04,使用命令行启动软件更新器,进行版本升级,结果开始升级就异常退出了,具体打印如下: $update-manager -d 正在检查新版 Ubuntu 使 ...

  7. Python HTMLTestRunner生成网页自动化测试报告时中文编码报错UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6

    1. 由于使用Python Selenium做网页自动化测试时,有截取网页上的中文信息保存到测试结果中,最终出现编码错误如下: File "D:/PycharmProjects/AutoTe ...

  8. python 3以上版本使用pickle.load读取文件报UnicodeDecodeError: 'ascii' codec can't decode byte 0x8b in position 6

    python 3以上版本使用pickle.load读取文件报UnicodeDecodeError: 'ascii' codec can't decode byte 0x8b in position 6 ...

  9. Windows下使用pip安装python包是报错-UnicodeDecodeError: 'ascii' codec can't decode byte 0xcb in position 0

    先交待下开发环境: 操作系统:Windows 7 Python版本:2.7.9 Pip版本:6.1.1 其他环境忽略 在windows下使用pip下载python包,出现如下错误 Collecting ...

随机推荐

  1. birt 日志打印

    在birt初始initialize 方法里,定义日志输出方法 importPackage(Packages.java.util.logging); importPackage(Packages.log ...

  2. 5.如何调节ubuntu的分辨率

    http://jingyan.baidu.com/article/0964eca2351ed58285f5361d.html

  3. (转)MFC中Doc,View,MainFrmae,App各指针的互相获取

    App是应用域,所有的域中的东西都可以通过全局函数访问到它. MainFrame是主框架,也基本可以用全局函数访问到. MainFrame下是若干个ChildFrame,ChildFrame中若干个V ...

  4. #if defined(__cplusplus)

    由于C++编译器需要支持函数的重载,会改变函数的名称,因此dll的导出函数通常是标准C定义的.这就使得C和C++的互相调用变得很常见.但是有时可能又会直接用C来调用,不想重新写代码,让标准C编写的dl ...

  5. 文本文件显示 删除文本文件前n个字符

    #include<iostream>#include<string.h>using namespace std;void displayContent(const char * ...

  6. Mysql中int和varchar类型

    int类型: int bigint smallint 和 tinyint 类型,如果创建新表时没有指定 int(M) 中的M时,默认分别是 : int           -------     in ...

  7. 3-CMD

    诞生背景AMD其实已经算是解决了前端模块化开发的问题了,但是!!!但是,因为AMD管理依赖的时候,会把所有的依赖下载到本地,并且立即执行一次.依赖少了还好,多的话,那么多js均要被执行一次,这个内存消 ...

  8. AtCoder Regular Contest 080 E - Young Maids

    地址:http://arc080.contest.atcoder.jp/tasks/arc080_c 题目: E - Young Maids Time limit : 2sec / Memory li ...

  9. 安卓 和 IOS 的icon 尺寸

    安卓 36*36 48*48 72*72 96*96 IOS Icon.png – 57×57 iPhone (ios5/6) Icon@2x.png – 114×114 iPhone Retina  ...

  10. Please check registry access list (whitelist/blacklist)

    https://blog.csdn.net/sprita1/article/details/51735566