在python 2.7

时间:2015-05-25 19:25:35

标签: python json character-encoding

我有一个python应用程序,它将一些对象编码为json,将json字符串传递给另一个程序,然后读入该json字符串的可能修改版本。

我需要检查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

我愿意打赌有一个简单的解决方案,但是我在谷歌搜索和搜索所有搜索引擎都找不到合适的解决方案。

1 个答案:

答案 0 :(得分:0)

解决此问题的最简单方法是转到生成此dict的内容并正确编码为utf-8。目前,您的密钥编码为CP-1252

print('\xe2'.decode('cp1252'))
â

如果您无法修复源代码,则需要进行一些后期处理。

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处理存在差异)