Mat*_*uth 3 python encoding json utf-8 python-3.x
我有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文件是否符合规范的有效JSON文件?
您的文本已经编码,您需要通过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á'}
Run Code Online (Sandbox Code Playgroud)
您正在阅读的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)
Run Code Online (Sandbox Code Playgroud)
输出:
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á
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8560 次 |
| 最近记录: |