Domanda

Ho fatto alcuni script in python che si connette a Gmail e stampare un testo e-mail ... Ma, spesso le mie email ha parole con "accento". E c'è il mio problema ...

Per esempio, un testo che ho ricevuto:. "PLANO DE S = C3 = 9ADE" deve essere stampato come "PLANO de Saúde"

Come posso trasformare il mio testo leggibile e-mail? Cosa posso utilizzare per convertire le lettere di tesi con l'accento?

Grazie,


Il codice suggerito da Andrey, funziona bene su Windows, ma su Linux ho ancora trovato la stampa sbagliato:

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

Rafael,

Grazie, si sono corretti sulla parola, che è stato scritto male. Ma il problema ancora lo stesso qui. Un altro esempio: Parola corretta: obersevação

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

sto usando Debian con UTF-8:

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

Andrey,

Grazie per il vostro tempo. Sono d'accordo con la tua spiegazione, ma sempre con lo stesso problema qui. Date un'occhiata nel mio 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
È stato utile?

Soluzione

Questa codifica è chiamato quoted-printable. Nel tuo esempio, si dispone di una stringa (unicode di Python) codificato in UTF-8 byte (str di Python) codificati in byte stampabili citati. Quindi il modo giusto per ottenere un valore di stringa è:

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

Aggiornamento: Ci potrebbero essere alcuni problemi con la console conding però. s detiene un completamente corretto valore stringa Unicode (di tipo Python unicode). Ma quando si utilizza l'istruzione print, il valore di deve essere convertito in byte (str di Python) al fine di essere scritti a OS numero descrittore di file 1 (il tubo di uscita standard). Quindi la dichiarazione print controlli di implementazione la codifica console, poi fa alcune ipotesi e stampe i risultati. In effetti, in Python 2 i risultati saranno differenti per la stampa dalla shell interattiva, che esegue il processo in modo non interattivo ed eseguire il processo, mentre reindirizzando l'output in un file.

Il modo migliore per uscita stringhe codificate in Python 2 non è concordato. Due modi che rendono più senso sono:

1) Uso di codifica indovinare e codificare manualmente stringhe locale.

import locale
ENCODING = locale.getpreferredencoding()

print s.encode(ENCODING)

2) Utilizzare un opzione di codifica (a linea di comando, hard-coded o qualsiasi altra cosa).

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)

Aggiornamento 2: Se non aiuta e ancora sicuri che il vostro codifica console e dei caratteri sono impostati su UTF-8, quindi provare questo:

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 questo punto si deve vedere la parola привет russa nel set di caratteri cirillico nella console:)

Se questo è il caso, allora si dovrebbe utilizzare questo stdout binario anziché sys.stdout normale.

Altri suggerimenti

La stringa è sbagliato, aspetto:

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

Dove è il mancante "A" in SAÚDE?

Se decodificare 'PLANO DE S=C3=9ADE' come quoted-printable, si otterrà solo 'PLANO DE Sude'.

L'esecuzione di questo codice qui su Linux (Ubuntu 9.10):

>>> b = 'PLANO DE S=C3=9ADE'
>>> s = b.decode('quopri').decode('utf-8')
>>> print s
PLANO DE SÚDE
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top