解码JSON字符串中的UTF8编码

2024-05-21 08:51:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个JSON文件,其中包含以下编码字符串:

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

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

使用.load()方法解码JSON后得到的结果是'HornÃ\xadková'。字符串应正确解码为'Horníková'

我阅读了JSON规范,了解到在\u之后应该有4个十六进制数字,用于指定字符的Unicode数字。但在这个JSON文件中,UTF-8编码的字节似乎存储为\u序列

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

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


Tags: 文件字符串name规范json类型编码数字
1条回答
网友
1楼 · 发布于 2024-05-21 08:51:17

您的文本已经编码,您需要通过在字符串中使用b前缀向Python说明这一点,但是由于您使用的是json,并且输入需要是字符串,因此您必须手动解码编码的文本。由于您的输入不是字节,因此可以使用'raw_unicode_escape'编码将字符串转换为字节而不进行编码,并防止open方法使用其自己的默认编码。然后,您可以简单地使用上述方法来获得所需的结果

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

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á'}
网友
2楼 · 发布于 2024-05-21 08:51:17

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

>>> "Horn\u00c3\u00adkov\u00c3\u00a1".encode('raw_unicode_escape').decode('utf8')
'Horníková'
网友
3楼 · 发布于 2024-05-21 08:51:17

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

下面是一个例子:

#!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)

输出:

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á

相关问题 更多 >