2010-03-30 9 views
0

Je travaille actuellement sur un bot irc pour un canal multilingue, et je rencontre des problèmes avec unicode qui s'avèrent presque impossibles à résoudre. Quelle que soit la configuration de l'encodage Unicode que j'essaie d'essayer, la fonction de listage du code ci-dessous ne fait rien (c.notice est une fonction de classe qui envoie une commande NOTICE au serveur irc) ou ça fait quelque chose, crache quelque chose qui n'est évidemment pas encodé.Problèmes unicode Python (2.6)

La commande devrait envoyer 天子, mais à la place, il semble bon d'envoyer å¤ © å avec une configuration précédente des mêmes commandes. Celui que j'ai spécifié ci-dessous est de la variété «n'envoie rien». Je n'ai pas travaillé avec Unicode auparavant, et je suis donc bloqué. Je suis également convaincu que je fais cela complètement faux en conséquence.

(compileCMD prend juste une liste et une seule recrache chaîne de tous les éléments dans la liste)

uk = self.compileCMD(self.faq.keys(),0) 
ukeys = unicode(uk,"utf-8").encode("utf-8") 
c.notice(nick, u"Current list of faq entries: %s" % (uk)) 
+0

Comment c.notice fait-elle son affaire? Je suppose que la dernière ligne devrait être 'c.notice (nick, u" ...% s "% (ukeys))'. Sinon, ce code Python devrait fonctionner - si ce n'est pas le cas, je suggère de regarder ce qui se passe ailleurs. Essayez de faire 'print' (ou' logging.debug() ') de' ukeys'. –

Répondre

1

Quelques points:

  • Les octets « å¤ © å "sont l'encodage UTF-8 de" 天子 ", alors es-tu sûr que c'est faux que ça soit envoyé? Est-ce que le programme/... qui devrait traiter les données utilise UTF-8, ou interprète-t-il simplement l'entrée comme un encodage différent comme Latin-1?
  • unicode(uk,"utf-8").encode("utf-8"): décodage UTF-8, puis réencodage comme UTF-8 ne change rien.
  • ukeys = unicode(uk,"utf-8").encode("utf-8"): La variable ukeys qui contient les données réencodées n'est pas utilisée ultérieurement.
0

Modifier ceci:

u"Current list of faq entries: %s" % (uk) 

dans ce:

"Current list of faq entries: %s" % (uk) 

et essayez à nouveau. Assurez-vous que uk est déjà une chaîne codée UTF-8 (pas unicode).

Je suppose que la méthode c.notice prend une chaîne codée comme argument, car elle doit envoyer une chaîne codée sur le réseau. Si le canal est multilingue, il y a fort à parier qu'il s'attend à ce qu'il soit encodé en UTF-8. En outre, supprimez la ligne ukeys = unicode(uk,"utf-8").encode("utf-8") inutile.

1

Il s'avère que le problème était avec le client que j'utilisais pour tester la sortie - il ne traitait pas unicode correctement lui-même!

+0

Cela est probablement dû au fait que l'IRC n'est pas spécifié pour utiliser Unicode (ou toute autre chose), et ISO-8859-1 est historiquement commun en raison des origines de l'IRC. – caf