Прошу прощения, если этот вопрос был задан ранее. Я до сих пор не понимаю, как кодировать в python3.2.

Я читаю csv (закодированный в UTF-8 без спецификации), и у меня есть французский акцент в csv.

Вот код для открытия и чтения файла csv:

csvfile = open(in_file, 'r', encoding='utf-8')
fieldnames = ("id","locale","message")    
reader = csv.DictReader(csvfile,fieldnames,escapechar="\\") 
for row in reader:
        if row['id'] == id and row['locale'] == locale:
            out = row['message'];

Я возвращаю сообщение (out) как Json

jsonout = json.dumps(out, ensure_ascii=True)    
return HttpResponse(jsonout,content_type="application/json; encoding=utf-8")

Однако, когда я просматриваю результат, я получаю замену акцента e (французский) на \ u00e9.

Не могли бы вы посоветовать, что я делаю неправильно и что мне делать, чтобы на выходе json отображался правильный e с акцентом.

Благодарность

5
tkansara 23 Фев 2016 в 19:12

2 ответа

Лучший ответ

Вы не делаете ничего плохого (и Python тоже).

Модуль Python json просто выбирает безопасный маршрут и избегает символов, отличных от ascii. Это допустимый способ представления таких символов в json, и любой соответствующий синтаксический анализатор воскресит правильные символы Unicode при синтаксическом анализе строки:

>>> import json
>>> json.dumps({'Crêpes': 5})
'{"Cr\\u00eapes": 5}'
>>> json.loads('{"Cr\\u00eapes": 5}')
{'Crêpes': 5}

Не забывайте, что json - это просто представление ваших данных, а оба "ê" и "\\u00ea" являются допустимыми json-представлениями строки ê. Соответствующие парсеры json должны правильно обрабатывать оба.

Однако можно отключить это поведение, см. Документацию json.dump:

>>> json.dumps({'Crêpes': 5}, ensure_ascii=False)
'{"Crêpes": 5}'
14
marcelm 23 Фев 2016 в 16:31

Что касается этого ответа, настройка ensure_ascii=False отображает специальные символы в ваших распечатках. С другой стороны, ответ Марсельма по-прежнему верен, поскольку в этих кодировках информация не теряется.

0
Community 23 Май 2017 в 10:29