2010-05-01 2 views
1

вот довольно простой пример, который заводит меня с ума через пару дней. Учитывая следующий сценарий:не может выводить кодированный json dict, содержащий акценты (noob inside)

# -*- coding: utf-8 -* 
from json import dumps as json_dumps 

machaine = u"une personne émérite" 
print(machaine) 

output = {} 
output[1] = machaine 
jsonoutput = json_dumps(output) 
print(jsonoutput) 

В результате этого из кли:

une personne émérite 
{"1": "une personne \u00e9m\u00e9rite"} 

Я не понимаю, почему их такое различие между этими двумя строками. Я пробовал все виды кодирования, декодирования и т. Д., Но, похоже, я не могу найти правильный способ сделать это. У кого-нибудь есть идея?

Заранее спасибо. Matthieu

+0

'é' был закодирован в' \ u00e9', потому что это не символ ASCII. Что в этом плохого? – kennytm

ответ

3

Кодировка верна. Загрузите его обратно и распечатать его, и вы увидите правильный вывод:

>>> import json 
>>> jsoninput = json.loads(jsonoutput) 
>>> print jsoninput 
{u'1': u'une personne \xe9m\xe9rite'} 
>>> print jsoninput['1'] 
une personne émérite 
+0

благодарю вас миллиард раз ... вы сделали свой день :-) – user296546

2

Чтобы уточнить ответ Марсело Cantos в: json.dumps() возвращает JSON-кодирование, которое является ASCII строку, начиная с символа ' {», и содержащие обратные слэши, кавычки и т.д. Вы должны декодировать (например, с json.loads(), чтобы получить обратно фактическую Dict с данными

# -*- coding: utf-8 -* 
import json 

output = {1: u"une personne émérite"} 
print output[1] 

json_encoded = json.dumps(output) 
print "Encoded: %s" % repr(json_encoded) 

input = json.loads(json_encoded) 
print input['1'] 

выходы:.

une personne émérite 
Encoded: '{"1": "une personne \\u00e9m\\u00e9rite"}' 
une personne émérite 
+0

Из любопытства, как будет обрабатываться javascript с закодированными символами? –

+0

JS будет работать правильно. Например. сохранить это как файл и загрузки в вашем браузере, вы должны увидеть правильную строку (по крайней мере я):

+0

Кодировки JSON не являются строками ASCII. Они являются строками Unicode, обычно передаются или сохраняются как UTF-8. –