无法解码gmail中的特殊字符 - python 3.6

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法解码gmail中的特殊字符 - python 3.6相关的知识,希望对你有一定的参考价值。

我制作了一个程序,该程序接收来自Gmail帐户的电子邮件,并保存其信息,特别是电子邮件的名称发件人,主题和正文作为纯文本。

我将此信息作为字符串获取,但问题是解码无法识别特殊字符,如重音符号。我尝试用UTF-8,iso-8859-1和latin-1解码电子邮件的字节内容,但我无法正确解码特殊字符。

这是我的代码和一些打印示例。

        result, email_data = mail.uid('fetch', latest_email_uid, '(RFC822)')    
        raw_email = email_data[0][1]

        raw_email_string = raw_email.decode('iso-8859-1')

        email_message = email.message_from_string(raw_email_string)

        cuerpomensaje = email_message.get_payload()[0]
        body = cuerpomensaje.get_payload()
        textoplano = None

        if type(body) == list:
            textoplano = body[0].get_payload()

        elif type(body) == str:
            textoplano = body

        emisor = email_message['From']

    print(email.utils.parseaddr(emisor)[0])
    print(email_message['Subject'])
    print(textoplano)

打印时,我得到了这个:

=?UTF-8?Q?Andr=C3=A9s?= =?UTF-8?Q?=C3=A1rbol_de_la_tierra?= palabras con tilde como =C3=A1rbol

但我应该得到这个:

Andrés árbol de la tierra palabras con tilde como árbol

答案
import re

import urllib.parse


def decode(text):
    if text.startswith('=?UTF-8?Q?') and text.endswith('?='):
        text = re.search('=?UTF-8?Q?(.*)?=', text).group(1)
    return urllib.parse.unquote(text.replace('=', '%'))

结果:

print(decode('=?UTF-8?Q?Andr=C3=A9s?='))
>>> Andrés

print(decode('=?UTF-8?Q?=C3=A1rbol_de_la_tierra?=').replace('_', ' '))
>>> árbol de la tierra

print(decode('palabras con tilde como =C3=A1rbol'))
>>> palabras con tilde como árbol

您还可以使用包email.header

from email.header import decode_header

s, d = decode_header('=?UTF-8?Q?=C3=A1rbol_de_la_tierra?=')[0]
print(s.decode(d))

以上是关于无法解码gmail中的特殊字符 - python 3.6的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有编解码器值的 python .replace 来删除特殊字符?

无法以正确的格式、gmail api 和 ae.net.mail 对特殊字符电子邮件进行编码

'utf-8'编解码器无法解码位置1中的字节0xf4:无效的连续字节

无法使用php显示mysql数据库中的特殊字符

Python请求:UnicodeEncodeError:'charmap'编解码器无法编码字符

创建 smtp() 时出现 Python smtplib 错误:“utf-8”编解码器无法解码字节