为什么Python json.dump在混合utf-8上失败&;unicode字符串?

为什么Python json.dump在混合utf-8上失败&;unicode字符串?,python,json,unicode,encoding,utf-8,Python,Json,Unicode,Encoding,Utf 8,Python(2.x)内置json库支持对unicode和utf-8编码(非ASCII)字符串进行编码,但显然不能同时进行编码。尝试: 导入json;json.dumps([u'Ä',u'Ä'。编码(“utf-8”)],确保ascii=False) 看到它引发了一场灾难。鉴于两者: json.dumps([u'Ä'],确保_ascii=False) 及 json.dumps([u'Ä'.encode(“utf-8”)],确保ascii=False) …工作正常 为什么使用unicode和utf-

Python(2.x)内置json库支持对unicode和utf-8编码(非ASCII)字符串进行编码,但显然不能同时进行编码。尝试:

导入json;json.dumps([u'Ä',u'Ä'。编码(“utf-8”)],确保ascii=False)

看到它引发了一场灾难。鉴于两者:

json.dumps([u'Ä'],确保_ascii=False)

json.dumps([u'Ä'.encode(“utf-8”)],确保ascii=False)

…工作正常


为什么使用unicode和utf-8编码(非ASCII)字符串对数据进行JSON编码会产生UnicodeDecodeError?我的Python站点编码是ASCII。

它不起作用,因为它不知道要生成什么类型的输出字符串

在我的Python 2.7中:

>>> json.dumps([u'Ä'], ensure_ascii=False)
u'["\xc4"]'
(Unicode字符串)

(UTF8编码的字节字符串)

因此,如果您给它UTF8编码的字节字符串,它将生成UTF8编码的字节字符串JSON,如果您给它Unicode字符串,它将生成Unicode JSON

如果你把它们混在一起,就不能两者兼而有之

要解决此问题,您可以给出一个显式编码参数(即使默认值是正确的),并且它似乎总是使结果成为unicode字符串:

>>> import json; json.dumps([u'Ä', u'Ä'.encode("utf-8")], ensure_ascii=False, encoding="UTF8")
u'["\xc4", "\xc4"]'

顺便说一句,至少ujson可以很好地处理这种情况。
json.dumps(['Ä.encode(“utf-8”)],确保_ascii=False)
无法正常工作。哪个Python版本?我认为您应该使用
u'Ä“。encode(“utf-8”)
(注意u!)@Petri:您也应该在另一行上修复它。“utf-8 encoded”不是字符串。这只是一个字节序列。注意:如果使用
encoding='utf-8'
而不是
encoding='UTF8'
,则“修复”不起作用。为了避免这个问题,您应该将Unicode字符串传递给
json
。我愿意接受这个答案,但我不认为原因是“它不知道生成什么”。我记得在某个地方读到,在这种情况下有一些隐含的解码?我知道你的意思,但这是工作时的一个快速回答,我要等到以后才有时间调查到底发生了什么。就让它开着吧,也许其他人会想出一些更技术的东西:-)
>>> import json; json.dumps([u'Ä', u'Ä'.encode("utf-8")], ensure_ascii=False, encoding="UTF8")
u'["\xc4", "\xc4"]'