Forum Programmation.python UTF-8 et les listes...

Posté par  .
Étiquettes : aucune
0
10
juil.
2005
Bonjour bonjour.

J'espère que vous allez pouvoir m'aider :]

Ds mon script, si je mets ceci :
msg = "éèàç"


print msg


Il m'affichera correctement éèàç : Ok.

Si je mets ceci :

liste = ["Bonjour", "éèàç"]


print liste

Je me retrouve avec cela :
['Bonjour', '\xc3\xa9\xc3\xa8\xc3\xa0\xc3\xa7']

et ce, même si je mets : # -*- coding: UTF-8 -*- au début de mon code :]
Que se passe-t-il docteur ?

Merci bcp de votre aide :]
  • # hum

    Posté par  (site web personnel, Mastodon) . Évalué à 4.

    et si tu fais print liste[1] tout s'affiche correctement? non ?

    je suppute que lorque tu fais print sur une string , python fait implicitement la conversion dans le système de codage précisé (# -*- coding: UTF-8 -*-) sinon il utilise celui par défaut!

    par contre si tu le fait sur une liste, python ne fait pas un analyse du contenu et affiche tout brut (donc pas de conversion) !!!

    cela dit je pense pas que ce soit un problème si cela se produit juste lorsque tu fais un print sur une liste !

    M.
    • [^] # Re: hum

      Posté par  . Évalué à 1.

      En effet, si je fais un print de liste[1], il m'affiche le contenu correctement.

      Je n'avais même pas pensé à essayer ça -_- ...

      En effet, ds ce cas, ça ne pose pas de problèmes :]

      Merci
  • # encodages

    Posté par  . Évalué à 2.

    à priori, tu n'as pas l'air très à l'aise avec les notions d'encodage.
    un bon point de départ pourrait être le tutorial unicode de Marc-André Lemburg, un des pères de l'unicode de python.

    http://www.reportlab.com/i18n/python_unicode_tutorial.html(...)

    pour en revenir à ton 'problème' (qui n'existe pas par ailleurs), il faut juste comprendre que les données ont une représentation interne et une représentation externe.
    dans l'interpréteur python, quand tu donnes juste le nom d'une variable de type string, python va chercher la méthode de représentation externe de la chaîne, ce qui conduit donc à remplacer les caractères d'encodage par un caractère accentué ou spécial, d'où un \xc3\xa9 qui devient un é (en UTF8).
    par contre pour une liste, la méthode de représentation externe ne fait pas de récursion dans les éléments de la liste, les éléments qui la consititue apparaissent sous la forme suivante [ elt0 , elt1 , ... ], mais chaque élément est affiché selon sa représentation interne, d'où l'apparition des caractères d'encodage pour les éléments de type string.
    • [^] # Re: encodages

      Posté par  . Évalué à 1.

      oui en gros c'est la différence entre les deux fonctions prédéfinies (qui sont surchargeables pour tes propres classes) : __re__() et __str__() __str__ permet de convertir l'objet dans une chaine de caractères. elle est appelée automatiquement par print __re__ renvoie la chaine contenant la représentation interne de ton objet. sur ton objet liste, ça ne renvoit donc pas ce que tu attendais... car :
      print liste
      est équivalent à
      liste.__str__()
      qui lui même vaut
      [elt0.__re__(), elt1.__re__(), ... ]
      si tu fais un :
      for elt in liste:
          print elt
      
      ça va être bon, car équivalent à :
      [elt0.__str__(), elt1.__str__(), ...]

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.