Question

Je l'ai fait un script en python qui se connecte à GMAIL et imprimer un texte e-mail ... Mais, souvent mes e-mails a des mots avec « accent ». Et il y a mon problème ...

Par exemple, un texte que je suis arrivé. "PLANO DE S = C3 = 9ADE" doit être imprimé comme "PLANO DE SAÚDE"

Comment puis-je me lisible mon texte e-mail? Que puis-je utiliser pour convertir des thèses de lettres avec accent?

Merci,


Le code proposé par Andrey, fonctionne très bien sur les fenêtres, mais sur Linux, je reçois toujours l'impression incorrect:

>>> b = 'PLANO DE S=C3=9ADE'
>>> s = b.decode('quopri').decode('utf-8')
>>> print s
PLANO DE SÃDE

Rafael,

Merci, vous avez raison sur le mot, il a été mal orthographié. Mais le problème reste le même ici. Un autre exemple: MOT CORRECT: obersevação

>>> b = 'Observa=C3=A7=C3=B5es'
>>> s = b.decode('quopri').decode('utf-8')
>>> print s
Observações

J'utilise Debian avec locale UTF-8:

>>> :~$ locale
LANG=en_US.UTF-8

Andrey,

Merci pour votre temps. Je suis d'accord avec votre explication, mais toujours avec la même problème. Prenez regard dans mon test:

   s='Observa=C3=A7=C3=B5es'
   s2= s.decode('quopri').decode('utf-8')

   >>> print s

   Observa=C3=A7=C3=B5es

   >>> print s2

   Observações

   >>> import locale

   >>> ENCODING = locale.getpreferredencoding()

   >>> print s.encode(ENCODING)
   Observa=C3=A7=C3=B5es

   >>> print s2.encode(ENCODING)
   Observações

   >>> print ENCODING
   UTF-8
Était-ce utile?

La solution

Ce codage est appelé quoted-imprimable. Dans votre exemple, vous avez une chaîne (le Python de unicode) encodé en UTF-8 octets (le Python de str) codées en octets imprimables cités. Donc, la bonne façon d'obtenir une valeur de chaîne est:

>>> b = 'PLANO DE S=C3=9ADE'
>>> s = b.decode('quopri').decode('utf-8')
>>> print s
PLANO DE SÚDE

Mise à jour: Il pourrait y avoir quelques problèmes avec la console conding cependant. s contient une valeur de chaîne de caractères Unicode entièrement correcte (unicode de type Python). Mais lorsque vous utilisez l'instruction print, la valeur doit être converti en octets (le de str Python) afin d'être écrit à OS numéro de descripteur de fichier 1 (le tuyau de sortie standard). Ainsi, les contrôles de mise en œuvre de votre déclaration de print de codage de la console, puis fait quelques suppositions et imprime les résultats. En fait, en Python 2 les résultats seront différents pour l'impression à partir du shell interactif, en cours d'exécution non interactive de votre processus et l'exécution de votre processus tout en redirigeant la sortie vers un fichier.

La meilleure façon de chaînes codées de sortie en Python 2 n'est pas convenu. Deux façons qui font plus de sens sont:

1) Utilisez guess encodage de locale et les chaînes encodent manuellement.

import locale
ENCODING = locale.getpreferredencoding()

print s.encode(ENCODING)

2) L'utilisation d'une option de codage (ligne de commande, codé en dur ou autre).

from getopt import getopt
ENCODING = 'UTF-8'
opts, args = getopt(sys.argv[1:], '', ['encoding='])
for opt, arg in opts:
    if opt == '--encoding':
        ENCODING = arg

print s.encode(ENCODING)

Mise à jour 2: Si rien ne vous aide et vous toujours sûr que l'encodage de votre console et la police sont réglées sur UTF-8, essayez ceci:

import sys, os
ENCODING = 'UTF-8'
stdout = os.fdopen(sys.stdout.fileno(), 'wb')
s = u'привет' # Don't forget to use a Unicode literal staring with u''
stdout.write(s.encode(ENCODING))

À ce stade, vous doit voir le mot russe привет dans le jeu de caractères cyrillique dans votre console:)

Si tel est le cas, vous devez utiliser ce stdout binaire au lieu de sys.stdout normal.

Autres conseils

Votre chaîne ne va pas, regard:

'PLANO DE S=C3=9ADE' == 'PLANO DE S\xc3\x9aDE'

Où est le manque "A" dans SAÚDE?

Si vous décodez 'PLANO DE S=C3=9ADE' comme cité imprimable, vous obtiendrez seulement 'PLANO DE Sude.

L'exécution de ce code ici sur linux (Ubuntu 9.10):

>>> b = 'PLANO DE S=C3=9ADE'
>>> s = b.decode('quopri').decode('utf-8')
>>> print s
PLANO DE SÚDE
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top