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