2010-09-19 6 views
3

J'essaie d'obtenir Mako rendre une chaîne de caractères unicode:Python/Mako: Comment obtenir des chaînes/caractères Unicode correctement analysés?

tempLook=TemplateLookup(..., default_filters=[], input_encoding='utf8',output_encoding='utf-8', encoding_errors='replace') 
... 
print sys.stdout.encoding 
uname=cherrypy.session['userName'] 
print uname 
kwargs['_toshow']=uname 
... 
return tempLook.get_template(page).render(**kwargs) 

Le fichier modèle connexe:

...${_toshow}... 

Et la sortie est:

UTF-8 
Deşghfkskhü 
... 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 1: ordinal not in range(128) 

Je ne Je pense qu'il y a un problème avec la chaîne elle-même puisque je peux l'imprimer très bien.

Bien que j'ai joué (beaucoup) avec les paramètres input/output_encoding et default_filters, il se plaint toujours d'être incapable de décoder/encoder avec le codec ascii.

J'ai donc décidé d'essayer l'exemple trouvé sur le documentation, et ce qui suit fonctionne le "meilleur":

input_encoding='utf-8', output_encoding='utf-8' 
#(note : it still raised an error without output_encoding, despite tutorial not implying it) 

Avec

${u"voix m’a réveillé."} 

Et le résultat étant

voix mâ�a réveillé 

Je ne comprends tout simplement pas pourquoi cela ne fonctionne pas. "Les commentaires d'encodage magiques ne fonctionnent pas non plus. Tous les fichiers sont encodés avec UTF-8.

J'ai passé des heures sans succès, ai-je oublié quelque chose?

Mise à jour:

J'ai maintenant question plus simple:

Maintenant que toutes les variables sont unicode, comment puis-je Mako pour rendre les chaînes unicode sans appliquer quoi que ce soit? Passer un filtre vide/render_unicode() n'aide pas.

Répondre

3

Oui, UTF-8! = Unicode.

UTF-8 est un encodage de chaîne spécifique, tout comme ASCII et ISO 8859-1. Essayez ceci:

Pour toute chaîne d'entrée faites un inputstring.decode('utf-8') (ou n'importe quel encodage d'entrée que vous obtenez). Pour toute chaîne de sortie faites un outputstring.encode('utf-8') (ou quel que soit l'encodage de sortie que vous voulez). Pour tout usage interne, des chaines de caractères unicode ('this is a normal string'.decode('utf-8') == u'this is a normal string')

'foo' est une chaîne, u'foo' est une chaîne unicode, qui n'a pas « avoir » un codage (ne peut pas être décodé). A chaque fois que python veut changer un encodage d'une chaîne normale, il essaie d'abord de le "décoder", de le "coder". Et la valeur par défaut est "ascii", ce qui échoue le plus souvent :-)

+0

Merci beaucoup pour la clarification. – felace

Questions connexes