2015-08-11 4 views
1

У меня есть приложение Django, используя tasypie для сериализации некоторых данных.json serialization вывод символов с акцентом неправильно, python/django

Существует имя

"Glòria" 

(с ударением «о») в базе данных, но это не сериализации правильно. В JSON производимого tasypie, он выходит как

"Glòria" 

Класс сериализатору выглядит следующим образом:

import json as simplejson 


class PrettyJSONSerializer(Serializer): 
    json_indent = 2 
    def to_json(self, data, options=None): 
     options = options or {} 
     data = self.to_simple(data, options) 
     return simplejson.dumps(data, cls=json.DjangoJSONEncoder, 
      sort_keys=True, ensure_ascii=False, indent=self.json_indent) 

Изменение атрибута на simplejson.dumps к

ensure_ascii=True 

возвращает следующие:

"Gl\u00f2ria" 
+0

Это Python 2 или 3? Если это Python 2, это имя, представленное объектом 'str' или' unicode'? – patrys

+0

Python 2.7, его сохраненный как unicode внутри, отладчик показывает: u'Gl \ xf2ria ' –

+0

Версия '' Gl \ u00f2ria' 'фактически является действительным JSON-представлением 'Glòria'. Вы уверены, что проблема с 'security_ascii = False' связана с сериализатором, а не с клиентом? – patrys

ответ

3

Я не могу комментировать (пока ..), поэтому я отправляю ответ. Python 2 не очень забавна с кодировками.

Glòria - правильное кодированное представление utf-8 данных в байтах. Gl \ u00f2ria - это внутреннее представление строк в юникоде Python 2. json.dumps возвращает строку юникода python. Что вы, вероятно, хотите сделать, это кодировать вывод json.dumps в utf8.

import json 
data = u'Gl\xf2ria' 
encoded_data = json.dumps(s, ensure_ascii=False).encode("utf8") 
print(encoded_data) 

отпечатки Glòria.

Edit: Просто чтобы убедиться, что

Glòria = Gl \ xc3 \ xb2ria. Напечатанные с заявлением на печать должны отображаться правильно, как Glòria.

+0

Вы правы, это может быть проблема с веб-браузером, так как использование curl в командной строке отображает его правильно. –

+1

Возможно, вы знакомы с этим вопросом, но если кто-то читает это позже, это не так: необходимо определить кодировку содержимого. text/html предоставляет html-теги для этого, но что-то вроде приложения/json может потребовать добавления кодировки в заголовки HTTP-типа контента для корректного отображения в браузерах (* Content-type: application/json; charset = utf-8 *). –