在 python 2.7 中使用非 ascii 字符编码然后解码 json
Encoding and then decoding json with non-ascii characters in python 2.7
我有一个 python 应用程序,它将一些对象编码为 json,将 json 字符串传递给另一个程序,然后读入该 [=27] 的可能修改版本=] 字符串。
我需要检查 json 编码对象发生了什么变化。但是,我在重新编码非 ascii 字符时遇到了问题。例如:
x = {'\xe2': None} # a dict with non-ascii keys
y = json.dumps(x,ensure_ascii=False)
y
#> '{"\xe2": null}'
工作正常,但是当我尝试加载 json 时,我得到:
json.loads(y)
#> UnicodeDecodeError: 'utf8' codec can't decode byte 0xe2 in position 0
json.loads(y.decode('utf-8','ignore'))
#> "{u'': None}"
json.loads(y.decode('utf-8','replace'))
#> {u'\ufffd': None}
不幸的是 '\xe2' in {u'\ufffd': None}
的计算结果为 False
我敢打赌有一个简单的解决方案,但我在 SO 上的所有谷歌搜索和搜索都未能找到合适的解决方案。
解决此问题的最简单方法是转到生成此 dict
的内容,并将其中的内容正确编码为 utf-8。目前,您的密钥编码为 CP-1252.
print('\xe2'.decode('cp1252'))
â
如果您无法从源头上解决问题,则需要进行一些 post 处理。
d = {'\xe2': None}
fixed_d = {k.decode('cp1252'):v for k,v in d.iteritems()}
json.dumps(fixed_d)
Out[24]: '{"\u00e2": null}'
json_dict_with_unicode_keys = json.dumps(fixed_d)
json_dict_with_unicode_keys
Out[32]: '{"\u00e2": null}'
print(json.loads(json_dict_with_unicode_keys).keys()[0])
â
(本回答的部分内容假定您使用的是python 2,py3 中的unicode 处理存在差异)
我有一个 python 应用程序,它将一些对象编码为 json,将 json 字符串传递给另一个程序,然后读入该 [=27] 的可能修改版本=] 字符串。
我需要检查 json 编码对象发生了什么变化。但是,我在重新编码非 ascii 字符时遇到了问题。例如:
x = {'\xe2': None} # a dict with non-ascii keys
y = json.dumps(x,ensure_ascii=False)
y
#> '{"\xe2": null}'
工作正常,但是当我尝试加载 json 时,我得到:
json.loads(y)
#> UnicodeDecodeError: 'utf8' codec can't decode byte 0xe2 in position 0
json.loads(y.decode('utf-8','ignore'))
#> "{u'': None}"
json.loads(y.decode('utf-8','replace'))
#> {u'\ufffd': None}
不幸的是 '\xe2' in {u'\ufffd': None}
的计算结果为 False
我敢打赌有一个简单的解决方案,但我在 SO 上的所有谷歌搜索和搜索都未能找到合适的解决方案。
解决此问题的最简单方法是转到生成此 dict
的内容,并将其中的内容正确编码为 utf-8。目前,您的密钥编码为 CP-1252.
print('\xe2'.decode('cp1252'))
â
如果您无法从源头上解决问题,则需要进行一些 post 处理。
d = {'\xe2': None}
fixed_d = {k.decode('cp1252'):v for k,v in d.iteritems()}
json.dumps(fixed_d)
Out[24]: '{"\u00e2": null}'
json_dict_with_unicode_keys = json.dumps(fixed_d)
json_dict_with_unicode_keys
Out[32]: '{"\u00e2": null}'
print(json.loads(json_dict_with_unicode_keys).keys()[0])
â
(本回答的部分内容假定您使用的是python 2,py3 中的unicode 处理存在差异)