UnicodeDecodeError:'utf-8'编解码器无法解码字节

薄洪涛6年前Python1218

我试图想把一个对象转换成json,但是一直报错

json_txt = json.dumps(log_txt)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 2892: invalid continuation byte

原因是对象中有一些乱码字符,utf-8无法解码这些字符

解决方法:

json_txt = json.dumps(log_txt,ensure_ascii=False)

加一个参数,原因以后再探究吧

################################分割线#########################################

几天后,探究一下原因,找了下手册

json.dump(objfpskipkeys=Falseensure_ascii=Truecheck_circular=Trueallow_nan=True

cls=Noneindent=Noneseparators=Noneencoding="utf-8"default=Nonesort_keys=False**kw)

    Serialize obj as a JSON formatted stream to fp (a .write()-supporting file-like object) using this conversion table.

    If skipkeys is true (default: False), then dict keys that are not of a basic type (strunicodeintlongfloatboolNone) will be skipped instead of raising a TypeError.

    If ensure_ascii is true (the default), all non-ASCII characters in the output are escaped with \uXXXX sequences, and the result is a str instance consisting of ASCII characters only. If ensure_ascii is false, some chunks written to fp may be unicode instances. This usually happens because the input contains unicode strings or the encoding parameter is used. Unless fp.write() explicitly understands unicode (as in codecs.getwriter()) this is likely to cause an error.


翻译一下最后一段,如果ensure_ascii为True(默认值),输出的非ASCII字符都会使用\xxx转义,dumps返回值是str且仅包含ASCII字符;

如果ensure_ascii为False,( some chunks written to fp may be unicode instances这句没看懂,好像是说fp应该是unicode实例)

因为输入包含unicode字符串或使用了encoding编码参数。除非fp.write() 是unicode(如codecs.getwriter()),否则这可能会导致错误。


也就是说我的错误是因为编码问题引起的,我要json化的数据含有一些字符(如0xe9) ,如果使用默认值,ensure_ascii=true,按照ascii编码是无法解析的,指定ensure_ascii=False,会原样输出

举个栗子

print(json.dumps("你好"))
print(json.dumps("你好",ensure_ascii=False))

输出"\u4f60\u597d"
输出"你好"


相关文章

python爬虫第二篇之安居客

python爬虫第二篇之安居客

最近考虑换个环境,打算去租个房子,但是租房信息那么多,我们能不能把它爬取下来做个统计,看看什么价位的房子最多,哪个地段的房子最便宜呢在爬取之前,请大家安装下BeautifulSoup库和request...

常用中文编码方式对比

最近项目中涉及到了使用python解析文件内容的需求,文件中全都是中文,由于这一过程中碰到的乱码问题实在过多,所以特地花时间研究了一下中文编码。本文中先介绍一下ASCII,GB2312,GBK和GB1...

UTC转标准时间和时间戳

最近做解析的时候,有这么一条命令[root@qip1200 ~]# date Thu Oct 25 20:33:02 HST 20...

Python之为世界贡献你的轮子

何为轮子?我理解的就是能重复使用的一些包,类,库,,就是咱们通过pip install XX下载的包,今天学习些如何自己写一个包让别人可以使用pip下载并使用第一步,注册账号https://pypi....

Python3使用logging模块记录日志

Python3使用logging模块记录日志

之前的时候我记录日志都是自己手写,将内容写进文件,总觉得这样好low,今天在写企业微信脚本的时候,就查了下,果然有logging模块,就直接拿过来用了,百度代码如下logging.basicConfi...

python爬虫第一篇之环境的搭建

python爬虫第一篇之环境的搭建

爬虫入门知识及环境的搭建今天我们来学习下爬虫一、 什么是爬虫如果我们把互联网比作一张大的蜘蛛网,数据便是存放于蜘蛛网的各个节点,而爬虫就是一只小蜘蛛,沿着网络抓取自己的猎物(数据)爬虫指的是...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。