首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用JSON字符串解码UTF-8编码

用JSON字符串解码UTF-8编码
EN

Stack Overflow用户
提问于 2018-05-26 07:22:34
回答 4查看 22.1K关注 0票数 10

我有JSON文件,它包含以下编码的字符串:

"sender_name": "Horn\u00c3\u00adkov\u00c3\u00a1",

我正在尝试使用json模块解析这个文件。但是,我无法正确地解码这个字符串。

在使用.load()方法解码JSON之后,我得到的是'HornÃ\xadková'。应该将字符串正确地解码为'Horníková'

我阅读了JSON规范,并且我理解在\u之后应该有4个十六进制数字,指定字符的Unicode号。但是在这个JSON文件中,UTF-8编码的字节似乎被存储为\u-sequences。

这是什么类型的编码,以及如何在Python 3中正确地解析它?

根据规范,这种类型的JSON文件甚至有效吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-05-26 09:49:46

您的文本已经被编码,您需要通过在字符串中使用b前缀来告诉Python,但是由于您使用的是json,而且输入需要是字符串,所以您必须手动解码编码的文本。由于输入不是字节,所以可以使用'raw_unicode_escape'编码将字符串转换为字节而不进行编码,并阻止open方法使用自己的默认编码。然后,您可以简单地使用前面提到的方法来获得所需的结果。

注意,由于您需要进行编码和解码,您必须读取文件内容并对加载的字符串执行编码,因此您应该使用json.loads()而不是json.load()

代码语言:javascript
复制
In [168]: with open('test.json', encoding='raw_unicode_escape') as f:
     ...:     d = json.loads(f.read().encode('raw_unicode_escape').decode())
     ...:     

In [169]: d
Out[169]: {'sender_name': 'Horníková'}
票数 9
EN

Stack Overflow用户

发布于 2018-05-27 05:48:08

您正在读取的JSON写得不正确,从它解码的Unicode字符串必须用错误的编码重新编码,然后用正确的编码进行解码。

下面是一个例子:

代码语言:javascript
复制
#!python3
import json

# The bad JSON you have
bad_json = r'{"sender_name": "Horn\u00c3\u00adkov\u00c3\u00a1"}'
print('bad_json =',bad_json)

# The wanted result from json.loads()
wanted = {'sender_name':'Horníková'}

# What correctly written JSON should look like
good_json = json.dumps(wanted)
print('good_json =',good_json)

# What you get when loading the bad JSON.
got = json.loads(bad_json)
print('wanted =',wanted)
print('got =',got)

# How to correct the mojibake string
corrected_sender = got['sender_name'].encode('latin1').decode('utf8')
print('corrected_sender =',corrected_sender)

输出:

代码语言:javascript
复制
bad_json = {"sender_name": "Horn\u00c3\u00adkov\u00c3\u00a1"}
good_json = {"sender_name": "Horn\u00edkov\u00e1"}
wanted = {'sender_name': 'Horníková'}
got = {'sender_name': 'HornÃ\xadková'}
corrected_sender = Horníková
票数 7
EN

Stack Overflow用户

发布于 2018-05-26 08:38:03

我对JSON还不太了解,无法判断这是否有效,但是您可以使用raw_unicode_escape编解码器解析这些字符串:

代码语言:javascript
复制
>>> "Horn\u00c3\u00adkov\u00c3\u00a1".encode('raw_unicode_escape').decode('utf8')
'Horníková'
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50540370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档