2010-01-05 4 views
1

Je suis vraiment perdu dans tous les problèmes de codage/décodage avec Python. Ayant lu assez peu de documents sur la façon de gérer parfaitement entrant, j'ai toujours des problèmes avec quelques langues, comme le coréen. De toute façon, voici ce que je fais. Je sauvegarde les données ci-dessus dans la base de données, ce qui passe bien.Encodage Python Problème

plus tard quand j'ai besoin pour afficher les données, le contenu de i db d'extraction, et procédez comme suit:

korean_text = korean_text.encode('utf-8') 
print korean_text 

Et tout ce que je vois est '???' écho sur le navigateur. Quelqu'un peut-il s'il vous plaît laissez-moi savoir quelle est la bonne façon d'enregistrer et d'afficher les données ci-dessus.

Merci

+0

est-ce que le deuxième «encoder» devrait être un «décodage»? – miku

+0

Avez-vous les polices nécessaires installées? – Kugel

+0

Avez-vous déclaré que votre sortie était codée avec UTF-8? – Gumbo

Répondre

8

Même après avoir lu certains documents, vous semblez être confus sur la façon dont fonctionne unicode.

  • Unicode n'est pas un codage. Unicode est l'absence d'encodage.
  • utf-8 n'est pas unicode. utf-8 est un encodage.
  • Vous décoder utf-8 bytestrings pour obtenir unicode. Vous coder unicode en utilisant un encodage, disons, utf-8, pour obtenir un bytestring codé.
  • Seules les chaînes d'octets peuvent être sauvegardées sur disque, base de données ou envoyées sur un réseau, ou imprimées sur une imprimante ou un écran. Unicode n'existe que dans votre code.

La bonne pratique consiste à décoder tout ce que vous obtenez le plus tôt possible, travailler avec elle décodé, comme unicode, dans tout votre code, puis l'encoder le plus tard possible, lorsque le texte est prêt à laisser votre programme, à l'écran, base de données ou réseau.


Maintenant, pour votre problème:

Si vous avez un texte qui est venu du navigateur, par exemple, d'une forme, il est codé. C'est un bytestring. Ce n'est pas unicode.

Vous devez ensuite le décoder pour obtenir unicode. Décodez-le en utilisant l'encodage utilisé par le navigateur pour encoder. L'encodage correct provient du navigateur lui-même, dans l'en-tête HTTP REQUEST correct. N'utilisez pas 'ignore' lors du décodage.

Puisque le navigateur a indiqué quel encodage il utilise, vous ne devriez pas avoir d'erreurs. Utiliser 'ignore' signifie que vous allez cacher un bug s'il y en a un. Peut-être que votre framework Web de prédilection le fait déjà. Je sais que django, pylons, werkzeug, cherrypy le font tous. Dans ce cas, vous obtenez déjà unicode.

Maintenant que vous avez une chaîne unicode décodée, vous pouvez l'encoder en utilisant le codage que vous souhaitez stocker dans la base de données. utf-8 est un bon choix, car il peut encoder tous les points de code Unicode.

Lorsque vous récupérez les données de la base de données, décodez-les en utilisant le même codage que vous avez utilisé pour les stocker. Et puis l'encoder en utilisant le codage que vous souhaitez utiliser sur la page - celui déclaré dans le meta header html <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>.Si le codage est le même que celui utilisé à l'étape précédente, vous pouvez ignorer le décodage/réencodage puisqu'il est déjà encodé dans utf-8.

Si vous voyez ??? alors les données sont perdues à n'importe quelle étape ci-dessus. Pour savoir exactement, plus d'informations sont nécessaires.

+2

+1 Dommage qu'il soit trop long pour imprimer sur une tasse de café. –

+0

nokklo, Merci pour votre réponse. Voici ce que je suis en train de faire - Je vais chercher le flux RSS de l'url suivante - http://rixk.com en utilisant feedparser. Après avoir parcouru votre bonne explication ci-dessus, j'ai vérifié avec les docs de feedparser et il dit que chaque valeur d'élément est retournée comme une chaîne Python Unicode (avec quelques exceptions - http://www.feedparser.org/docs/introduction.html) . Maintenant que les données sont déjà Unicode, comme je l'ai expliqué ci-dessus, je ne devrais pas vraiment l'encoder au début, mais travailler avec la chaîne unicode tout le temps, jusqu'à ce que juste avant de valider la base de données. Est-ce correct? – vivpuri

+0

* Maintenant que les données sont déjà Unicode, comme expliqué ci-dessus, je ne devrais pas vraiment l'encoder tôt * -> Typo: Vous auriez dû dire "je ne devrais pas vraiment être ** décoder ** tôt" - depuis il est déjà décodé (unicode). Et il est décodé le plus tôt possible, par feedparser lui-même! Vous devriez juste l'encoder avant de l'envoyer à DB. – nosklo

0

Lire à travers this post à propos de la gestion Unicode en Python.

Vous voulez essentiellement à faire ces choses:

.encode() text to a particular encoding (such as utf-8) before sending it to the database. 
.decode() text back to unicode (from your encoding) when reading it from the database 
0

Le problème est très certainement (surtout si d'autres caractères non-ASCII semblent fonctionner correctement) que votre navigateur ou système d'exploitation ne sont pas les bonnes polices pour afficher le texte coréen, ou que la police par défaut utilisée par votre navigateur ne prend pas en charge le coréen. Essayez de choisir une autre police jusqu'à ce que cela fonctionne.