2010-10-14 22 views
4

J'utilise Pylônes cadre, modèle Mako pour une application basée sur le Web. Je ne me suis pas vraiment soucié de la façon dont Python gère les chaînes Unicode. J'ai eu un moment de tension quand j'ai vu mon site s'écraser lorsque la page a été rendue et plus tard j'ai appris que c'était lié à UnicodeDecodeError. Après avoir vu l'erreur, j'ai démarré le maillage autour de mon code Python en ajoutant le codage, décodé les appels pour la chaîne avec l'option 'ignore' mais je ne pouvais toujours pas voir les erreurs disparues quelque temps.Meilleures pratiques pour Python UnicodeDecodeError

Enfin, je décodais en ascii avec ignore et faisais fonctionner le site sans accident.

Les entrées sur mon site proviennent de nombreux sites. Cela signifie que je ne contrôle pas les langues ou la langue de choix. Mon site prend en charge les langues internationales et l'anglais. J'ai l'agrégation de flux qui ne concerne généralement pas unicode/ascii/utf-8. Pendant que j'affiche le texte à travers le modèle mako, je l'affiche tel quel.

N'étant pas un expert Web, quelles sont les meilleures pratiques pour gérer les chaînes dans le projet Python? Dois-je m'occuper uniquement du rendu du texte ou de toute la phase de l'application?

Répondre

10

Si vous avez une influence sur elle, c'est la façon indolore:

  • connaître votre codage d'entrée (ou décoder avec ignorer) et decode(encoding) les données dès qu'il frappe votre application
  • travail uniquement en interne avec unicode (u'something' est unicode), également dans la base de données
  • pour le rendu, l'exportation, etc., quand il quitte votre application, encode('utf-8') les données
2

cela peut ne pas être une option viable pour vous, mais permettez-moi de dire qu'un grand nombre d'erreurs liées à l'encodage disparaissent lors de l'utilisation de python 3, juste parce que la séparation entre les chaînes unicode et les objets octets est beaucoup plus claire. quand je dois utiliser python 2, j'opte pour la version 2.6, où vous pouvez déclarer from future import unicode_literals. incroyants devraient vraiment lire the link you posted, comme elle le souligne quelques subtilités avec le comportement en/décodage de Python qui heureusement disparu en Python 3.

vous dites

Je ne contrôle pas les langues ou langue de leur choix. Mon site prend en charge langues internationales et avec anglais. Je l'agrégation aliments qui ne généralement pas se soucier de bien unicode/ascii/utf-8

, tout ce que vous choisissez de le faire, il est clair que vous ne voulez pas que votre application Web pour planter juste parce que certains BLOGGER dænish dont Les flux que vous consommez ont choisi d'encoder leurs messages dans un schéma d'encodage scandinave obscur. le problème sous-jacent est pertinent pour toutes les applications Web, car les URL ne contiennent pas d'informations de codage et parce que vous ne savez jamais quelles séquences d'octets un utilisateur malveillant pourrait vouloir vous envoyer. Dans ce cas, je fais ce que j'appelle «décodage en chaîne sécurisé»: j'essaie de décoder comme utf-8 en premier, et si cela échoue, réessayez en utilisant cp1252. si cela échoue, je rejette la demande (HTTP 404) ou quelque chose de similaire.Vous avez mentionné les flux de processus et vous? Les flux? ne vous inquiétez pas d'unicode et des encodages. pourriez-vous clarifier cette déclaration? ça m'évite complètement comment on peut réussir à construire un site qui transporte du texte dans plusieurs langues sans se soucier des encodages. clairement en utilisant ascii seulement ne vous portera pas très loin.

+0

+1 Une bonne réponse, donc quand vous lisez un fichier, décodez toujours le premier droit? si un fichier txt n'offre pas d'encodage, comment puis-je savoir? –