caracteres especiales
Chema Cortés
py en ch3m4.org
Mie Dic 10 13:47:23 CET 2003
LLevo con éste tres intentos de intentar responder. A ver si este es el
definitivo :-P
Ana Ynduráin (España) escribió:
> Al cojer la cabecera from de algunos correos, me llegan nombres como el
> siguiente:
>
> From: Ana =?ISO-8859-1?Q?Yndur=E1in_=28Espa=F1a=29?=
>
> En este caso es pq hay un acento y una eñe
>
> Alguien me puede decir como "decodificar" esta cadena? Por mas que miro
> no encuentro nada...
Es codificación mime (quoted-printable). Tienes varios módulos con los
que manejar estas cabeceras. Más concretamente, échale un vistazo al
módulo 'email'. Seguro que te será de mucha utilidad.
Si quieres hacerlo "a pelo":
>>> import mimify
>>> s="From: Ana =?ISO-8859-1?Q?Yndur=E1in_=28Espa=F1a=29?="
>>> print mimify.mime_decode_header(s)
From: Ana Ynduráin (España)
Una solución más "elaborada":
>>> import email
>>> import email.Header
>>> s="From: Ana =?ISO-8859-1?Q?Yndur=E1in_=28Espa=F1a=29?="
>>> msg=email.message_from_string(s)
>>> msg.keys()
['From']
>>> email.Header.decode_header(msg["From"])
[('Ana', None), ('Yndur\xe1in (Espa\xf1a)', 'iso-8859-1')]
>>> #vamos a juntar todo en una sóla cadena
>>> res=[]
>>> for s,cod in email.Header.decode_header(msg["From"]):
... if cod:
... res.append(s.decode(cod))
... else:
... res.append(s)
>>> print " ".join(res)
Ana Ynduráin (España)
>>> #Ésto último, como es costumbre,
>>> #también se podía haber hecho en una sóla línea ;-)
>>> res=[ ((cod and s.decode(cod)) or s)
... for s,cod in
... email.Header.decode_header(msg["From"]) ]
>>> print " ".join(res)
Ana Ynduráin (España)
En cuanto a lo que comenta Marcos de mirarse el RFC del correo, hay que decir
que la implementación en python está incompleta, y que sólo admite codificación
en ISO-8859-1, aunque por otro lado, es la más habitual.
Más información sobre la lista de distribución Python-es