La lectura del texto con acento - Python
-
02-10-2019 - |
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
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