我有一个脚本可以生成一个JSON请求,可以在任何脚本中返回文本,然后输出文本(我对所返回的文本没有任何控制权)。
它适用于拉丁字符,但其他脚本输出为mojibake,我不确定出了什么问题。
在响应中,有问题的字符使用\ u语法编码。特别是,我有一个包含\u00d0\u00b8\u00d1\u0081\u00d0\u00bf\u00d1\u008b\u00d1\u0082\u00d0\u00b0\u00d0\u00bd\u00d0\u00b8\u00d0\u00b5
的字符串,该字符串应输出为испытание
,但输出为иÑпÑÑание
。
显然这与python如何处理unicode和UTF有关,但是尽管我已经阅读了所有内容,但我不明白发生了什么,知道如何解决它。
我试图从下面的代码中提取显着点:
response = requests.get(url, params=params, cookies=self.cookies, auth=self.auth)
text = response.text
print text
status = json.loads(text)
print status
for folder in status['folders']
print folder['name']
输出:
{ "folders": [ { "name": "\u00d0\u00b8\u00d1\u0081\u00d0\u00bf\u00d1\u008b\u00d1\u0082\u00d0\u00b0\u00d0\u00bd\u00d0\u00b8\u00d0\u00b5" } ] }
{u'folders': [{ u'name': u'\xd0\xb8\xd1\x81\xd0\xbf\xd1\x8b\xd1\x82\xd0\xb0\xd0\xbd\xd0\xb8\xd0\xb5' }]}
иÑпÑÑание
我也试过
status = response.json();
for folder in status['folders']:
print folder['name']
结果相同。
注意,我实际上是将字符串传递给要显示的GTKMenuItem,但print
字符串的输出与在菜单中显示的相同。
答案 0 :(得分:3)
正如@RicardoCárdenes在the comment中所说,服务器发送的回复不正确。你得到的回应是双重编码:
>>>> u = u'\xd0\xb8\xd1\x81\xd0\xbf\xd1\x8b\xd1\x82\xd0\xb0\xd0\xbd\xd0\xb8\xd0\xb5'
>>>> print u.encode('latin-1').decode('utf-8')
испытание
正确的字符串如下所示:
>>>> s = {u"name": u"испытание"}
>>>> import json
>>>> print json.dumps(s)
{"name": "\u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u0435"}
>>>> print s['name']
испытание
>>>> print s['name'].encode('unicode-escape')
\u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u0435
>>>> print s['name'].encode('utf-8')
испытание
>>>> s['name'].encode('utf-8')
'\xd0\xb8\xd1\x81\xd0\xbf\xd1\x8b\xd1\x82\xd0\xb0\xd0\xbd\xd0\xb8\xd0\xb5'