Pregunta

He hecho un poco de script en Python que se conecta a GMAIL y imprimir un texto de correo electrónico ... Pero, a menudo mis correos electrónicos tiene palabras con "acento". Y no es mi problema ...

Por ejemplo, un texto que llegué: "PLANO DE S = C3 = 9ADE" debe ser impreso como "PLANO DE SAÚDE"

¿Cómo puedo convertir mi texto legible e-mail? ¿Qué puedo usar para convertir las tesis letras con acento?

Gracias,


El código sugerido por Andrei, funciona bien en las ventanas, pero en Linux todavía conseguir la impresión equivocada:

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

Rafael,

Gracias, estás en lo correcto acerca de la palabra, que estaba mal escrito. Pero el problema sigue siendo el mismo que aquí. Otro ejemplo: PALABRA CORRECTA: obersevação

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

Estoy usando Debian con UTF-8:

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

Andrei,

Gracias por su tiempo. Estoy de acuerdo con su explicación, pero aún con el mismo problema aquí. Tome mirada en mi prueba:

   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
¿Fue útil?

Solución

Esta codificación se llama citado imprimible. En su ejemplo, usted tiene una cadena (unicode de Python) codificado en UTF-8 bytes (str de Python) codificados en bytes imprimibles citados. Así que la manera correcta para obtener un valor de cadena es:

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

Actualización: Puede haber algunos problemas con la consola conding sin embargo. s tiene un valor totalmente correcta cadena Unicode (de Python tipo unicode). Sin embargo, cuando se utiliza la instrucción print, el valor de debe puede convertir en bytes (str de Python) con el fin de ser escritos a OS descriptor de archivo número 1 (el tubo de salida estándar). Por lo que los controles de aplicación de los estados print su consola de codificación, a continuación, hace algunas suposiciones e imprime los resultados. De hecho, en Python 2 los resultados serán diferentes para la impresión desde el intérprete de comandos interactivo, el funcionamiento de su proceso de forma no interactiva y el funcionamiento de su proceso, mientras redirigiendo la salida a un archivo.

La mejor manera de cadenas codificadas de salida en Python 2 no se acuerda. Dos maneras que tienen más sentido son:

1) El uso de la codificación de adivinar y codificar manualmente cadenas locale.

import locale
ENCODING = locale.getpreferredencoding()

print s.encode(ENCODING)

2) Uso una opción de codificación (línea de comandos, modificable o lo que sea).

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)

Actualización 2: Si nada ayuda y todavía seguro de que su consola y codificación de fuente se establece en UTF-8, a continuación, intente lo siguiente:

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))

En este punto debe ver la palabra привет rusa en el juego de caracteres cirílico en su consola:)

Si este es el caso, entonces usted debe utilizar este stdout binario en lugar de sys.stdout normal.

Otros consejos

La cadena está mal, aspecto:

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

¿Dónde está la falta "A" en SAÚDE?

Si decodificar 'PLANO DE S=C3=9ADE' como imprimible citado, se obtendrá solamente 'plano de sude'.

Al ejecutar este código aquí en Linux (Ubuntu 9.10):

>>> b = 'PLANO DE S=C3=9ADE'
>>> s = b.decode('quopri').decode('utf-8')
>>> print s
PLANO DE SÚDE
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top