2010-09-09 19 views
2

J'ai fait un script en python qui se connecte à GMAIL et j'imprime un texte d'email ... Mais, souvent mes emails ont des mots avec "accent". Et il y a mon problème ...Lecture de texte avec Accent - Python

Par exemple un texte que j'ai obtenu: "PLANO DE S = C3 = 9ADE" devrait être imprimé comme "PLANO DE SAÚDE". Comment puis-je rendre lisible mon texte d'e-mail? Que puis-je utiliser pour convertir ces 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 de mal:

>>> 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 est toujours le même ici. Un autre exemple: CORRECT WORD: 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 le même problème ici. Regarde 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 
+0

Encore une mise à jour. –

Répondre

4

Cet encodage est appelé Quoted-printable. Dans votre exemple, vous avez une chaîne (unicode de Python) codée en octets UTF-8 (str de Python) codée en octets imprimables entre guillemets. 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 Unicode entièrement correcte (de type Python unicode). Mais lorsque vous utilisez l'instruction print, la valeur doit être être convertie en octets (str de Python) afin d'être écrit au numéro de descripteur de fichier OS 1 (le tuyau de sortie standard). Ainsi, l'implémentation de l'instruction print vérifie le codage de votre console, puis fait quelques suppositions et imprime les résultats. En fait, dans Python 2, les résultats seront différents pour l'impression à partir du shell interactif, en exécutant votre processus de manière non interactive et en exécutant votre processus tout en redirigeant la sortie vers un fichier.

La meilleure façon de générer des chaînes codées dans Python 2 n'est pas acceptée. Deux façons qui ont le plus de sens sont les suivantes:

1) Utiliser la fonction de chiffrement de locale et encoder manuellement les chaînes. 2) Utilisez une option de codage (ligne de commande, codée 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 en 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)) 

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

Si tel est le cas, alors vous devriez utiliser ce binaire stdout au lieu de ni mal sys.stdout.

+0

Andrey, cette solution a bien fonctionné sur Windows. Mais sur Linux le personnage est encore illisible: – Thomas

0

Votre chaîne est faux, regardez:

'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' en guise d'impression imprimée, vous obtiendrez uniquement 'PLANO DE SÚDE'.

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