2013-08-06 2 views
1

Я создаю один элемент таблицы, который содержит одно поле «имя», которое нужно хранить на японском языке. Я использую веб-службу для просмотра данных таблицы. Ниже приведен код,django unicode convert to japanese

from django.http import HttpResponse 
from rest_framework.renderers import JSONRenderer 

class JSONResponse(HttpResponse): 
    """ 
    An HttpResponse that renders it's content into JSON. 
    """ 
    def __init__(self, data, **kwargs): 
     content = JSONRenderer().render(data) 
     kwargs['content_type'] = 'application/json' 
     super(JSONResponse, self).__init__(content, **kwargs) 

from rest_framework import serializers 
class MemberSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Member 
     fields = ('member_id', 'name', 'homepage', 'map') 

    def restore_object(self, attrs, instance=None): 
     """ 
     Create or update a new Member instance, given a dictionary 
     of deserialized field values. 

     Note that if we don't define this method, then deserializing 
     data will simply return a dictionary of items. 
     """ 
     if instance: 
      # Update existing instance 
      instance.member_id = attrs.get('member_id', instance.member_id) 
      instance.name = attrs.get('name', instance.name) 
      instance.homepage = attrs.get('homepage', instance.homepage) 
      instance.map = attrs.get('map', instance.map) 
      return instance 

     # Create new instance 
     return Member(**attrs) 

//snapshot code 
serializer = MemberSerializer(member) 
return JSONResponse(serializer.data) 

'Имя' значение отображается как юникода, { "имя": "\ u691c \ u8a3a \ u3092 \ u4e88 \ u7d04 \ u3059 \ u308b"}. Как я могу преобразовать его в японский?

+0

Это Python 2 или 3? – user2357112

+0

Я использую Python 2.7 – taigetco

+0

Вы по-прежнему не дали понять, что вы подразумеваете под значением «Имя», как ... ». Отображает, где? Когда вы что-то делаете? То, что вы показали нам, представляет собой вполне достоверное представление строки Unicode с 7 японскими символами. Если вы хотите представить _different_ ... вы должны сказать нам, что вы делаете, чтобы получить это представление и в каком контексте, прежде чем мы сможем рассказать вам, что делать, чтобы получить другое представление. – abarnert

ответ

2

Попробуйте UnicodeJSONRenderer. JSONRenderer экранирует символы не-ascii с использованием \u синтаксиса; UnicodeJSONRenderer этого не сделает.

+0

Если я хочу показать японский язык в объекте json, как я могу это сделать? – taigetco

+0

Непонятная проблема. Попробуйте 'UnicodeJSONRenderer'. – user2357112

+0

Это не проблема. Как вы можете видеть, он возвращает правильную строку, просто он печатает 'repr', а не' str' этой строки. – abarnert

1

Строка уже есть по-японски. Он содержит 7 символов Юникода, каждый из которых является японским.

Проблема заключается в том, что, когда вы берете str из в Словаре или другой коллекции (что и происходит, когда вы print его), он включает в себя Repr каждого члена коллекции, а не ул.

Чтобы увидеть разницу:

>>> s = u"\u691c\u8a3a\u3092\u4e88\u7d04\u3059\u308b" 
>>> print str(s) 
検診を予約する 
>>> print repr(s) 
u'\u691c\u8a3a\u3092\u4e88\u7d04\u3059\u308b' 

Сейчас:

>>> ss = [s] 
>>> print str(ss) 
[u'\u691c\u8a3a\u3092\u4e88\u7d04\u3059\u308b'] 
>>> print repr(ss) 
[u'\u691c\u8a3a\u3092\u4e88\u7d04\u3059\u308b'] 

Если вы просто хотите print это или log это, есть множество вопросов, на SO, и запись в официальном Python FAQ, о том, как получить str для элементов внутри коллекции, но основная идея: явно называть str.

Если вы хотите встроить его в страницу, которую вы создали, например, UTF-8 или Shift-JIS, просто .encode('utf-8') или .encode('shift-jis'). (Тем не менее, стоит отметить, что с недавними версиями Django, особенно в Python 3.x, лучше сделать все как Unicode и позволить Django беспокоиться о кодировании в конце.)

Если вы хотите встроить его в JSON , и код с другой стороны трубы запутывается, это может помочь явно .encode('utf-8'). Но это не обязательно.

+0

print str (s), получил исключение в python2.7. Traceback (последний последний звонок): Файл «», строка 1, in UnicodeEncodeError: кодек ascii не может кодировать символы в позиции 0-6: порядковый номер не в диапазоне (128) – taigetco

+0

Но просто 'print s 'Отобразить японский – taigetco

+0

OK, это означает, что '' 'фактически является объектом' unicode'. В 2.7, вызов 'str (s)' в 'unicode' будет пытаться закодировать его на' sys.getdefaultencoding() ', который обычно является' ASCII'. Но идея такая же: вы не хотите называть 'repr' для каждой строки, поэтому вы не можете просто« распечатать »коллекцию, содержащую' unicode', больше, чем просто «распечатать» коллекцию, содержащую ' str's. – abarnert