我有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文件甚至有效吗?
发布于 2018-05-26 09:49:46
您的文本已经被编码,您需要通过在字符串中使用b前缀来告诉Python,但是由于您使用的是json,而且输入需要是字符串,所以您必须手动解码编码的文本。由于输入不是字节,所以可以使用'raw_unicode_escape'编码将字符串转换为字节而不进行编码,并阻止open方法使用自己的默认编码。然后,您可以简单地使用前面提到的方法来获得所需的结果。
注意,由于您需要进行编码和解码,您必须读取文件内容并对加载的字符串执行编码,因此您应该使用json.loads()而不是json.load()。
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á'}发布于 2018-05-27 05:48:08
您正在读取的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á发布于 2018-05-26 08:38:03
我对JSON还不太了解,无法判断这是否有效,但是您可以使用raw_unicode_escape编解码器解析这些字符串:
>>> "Horn\u00c3\u00adkov\u00c3\u00a1".encode('raw_unicode_escape').decode('utf8')
'Horníková'https://stackoverflow.com/questions/50540370
复制相似问题