web-dev-qa-db-fra.com

Impression d'une chaîne encodée en utf-8

J'utilise BeautifulSoup pour extraire du texte à partir d'un code HTML, mais je n'arrive pas à comprendre comment l'imprimer correctement à l'écran (ou dans un fichier d'ailleurs).

Voici à quoi ressemble ma classe contenant le texte:

class Thread(object):
    def __init__(self, title, author, date, content = u""):
        self.title = title
        self.author = author
        self.date = date
        self.content = content
        self.replies = []

    def __unicode__(self):
        s = u""

        for k, v in self.__dict__.items():
            s += u"%s = %s " % (k, v)

        return s

    def __repr__(self):
        return repr(unicode(self))

    __str__ = __repr__

Lorsque vous essayez d'imprimer une instance de Thread, voici ce que je vois sur la console:

~/python-tests $ python test.py
u'date = 21:01 03/02/11 content =  author = \u05d3"\u05e8 \u05d9\u05d5\u05e0\u05d9 \u05e1\u05d8\u05d0\u05e0\u05e6\'\u05e1\u05e7\u05d5 replies = [] title = \u05de\u05d1\u05e0\u05d4 \u05d4\u05de\u05d1\u05d7\u05df '

Quoi que j'essaye, je ne peux pas obtenir la sortie que j'aimerais (le texte ci-dessus doit être en hébreu). Mon objectif final est de sérialiser Thread dans un fichier (en utilisant json ou pickle) et de pouvoir le relire.

J'exécute cela avec Python 2.6.6 sur Ubuntu 10.10.

27
daniel

Pour sortir une chaîne Unicode dans un fichier (ou la console), vous devez choisir un encodage de texte. Dans Python le codage de texte par défaut est ASCII, mais pour prendre en charge les caractères hébreux, vous devez utiliser un codage différent, tel que UTF-8:

s = unicode(your_object).encode('utf8')
f.write(s)
24
Mark Byers

Une alternative intéressante à la réponse de @ mark consiste à définir la variable d'environnement PYTHONIOENCODING=UTF-8.

c.f . Ecriture de chaînes unicode via sys.stdout en Python .

(Assurez-vous de le définir avant de démarrer Python pas dans le script.)

11
Nir Levy