2010-02-17 5 views
2

Je suis en utilisant le modèle ci-dessous pour stocker les informations sur les pages:Django ORM et les données Unicode

class Page(models.Model): 
    title = models.TextField(blank = False, null = False) 

De nouvelles données correctement, je sauve suis la sauvegarde des données Unicode là (beaucoup de titres non-ASCII). Mais quand je joue requête:

page = Page.objects.filter(id = 1) 

page.title semble étrange:

u'\u042e\u0449\u0435\u043d\u043a\u043e' 

Que pouvais-je fait de mal? Merci.

Mise à jour: Vraiment, quand j'imprime page.title - ça a l'air OK. Mais je dois vider à JSON, donc après ce code:

dumps({'title': page.title}) 

Tout semble mauvais.

Mise à jour 2: Merci à tout le monde, m'a indiqué que ce comportement est correct. Mais les strins échappés à l'Unicode sont si longs. Puis-je les traduire en utf-8 d'une manière ou d'une autre?

Répondre

1

C'est le comportement correct: dumps encode le json pour vous. Il semble moche maintenant, mais c'est juste pour la transmission. Pour voir votre chaîne de caractères Unicode ont à nouveau pour le décoder (généralement à l'autre bout):

>>> from django.utils.simplejson import dumps, loads 
>>> original = u'\u042e\u0449\u0435\u043d\u043a\u043e' 
>>> print original 
Ющенко 
>>> encoded = dumps(original) 
>>> print encoded 
"\u042e\u0449\u0435\u043d\u043a\u043e" 
>>> decoded = loads(encoded) 
>>> print decoded 
Ющенко 

En général, vous aurez pas besoin de le décoder en python, il va se charger en tant que chaîne de caractères Unicode en javascript.

+0

Thaks. Tu as raison. – cleg

1

Peut-être que votre shell ne peut pas afficher les caractères Unicode? Que se passe-t-il si vous faites print page.title?

Que se passe-t-il si vous faites print page.title?

+0

La chaîne imprimée est OK, mais j'ai besoin de la sauvegarder dans json – cleg

2

C'est parfaitement bien. C'est "Ющенко" unicode-échappé.

+0

Existe-t-il un moyen de traduire une chaîne à échappement unicode à normal? – cleg

+0

Vous pouvez utiliser 's.encode ('utf8')' pour obtenir une représentation UTF8 de la chaîne. Que ce soit ce que vous voulez dépend de votre code client. –

+0

J'ai essayé toutes les combinaisons d'encodes-décodes possibles. J'ai simplement besoin de convertir cette représentation en str unicode commun. – cleg

3

Vous ne faites rien de mal. Avez-vous essayé de l'imprimer (ou de l'imprimer dans une page Web)?

In [1]: l = u'\u042e\u0449\u0435\u043d\u043a\u043e' 

In [2]: print l 
Ющенко 
+0

Je n'ai pas besoin de cette chaîne pour être imprimée. C'est mon problème. – cleg

1

Il n'y a pas de problème avec ce que vous avez posté jusqu'à présent.

>>> print json.dumps(u'\u042e\u0449\u0435\u043d\u043a\u043e') 
"\u042e\u0449\u0435\u043d\u043a\u043e" 

Ce qui est une chaîne JavaScript correcte littérale. Attribuez-le à une variable et vous obtiendrez Ющенко dans une chaîne JavaScript.

Quel est le problème réel? Qu'est-ce qui "a l'air mauvais"?

+0

Merci!Je pensais que les chaînes doivent être en UTF-8 – cleg