【问题标题】:Python: What is this encoding and how to decode?Python:这是什么编码以及如何解码?
【发布时间】:2019-04-28 08:51:33
【问题描述】:

我有很多来自邮件正文的字符串,它们是这样打印的:

=C3=A9

例如,这应该是“é”。

这种编码到底是什么以及如何解码?

我正在使用 python 3.5

编辑:

我设法通过应用正确编码了邮件正文:

quopri.decodestring(sometext).decode('utf-8') 

但是我仍然很难让 FROM 、 TO、 SUBJECT 等...部分正确。

这就是我构建电子邮件的方式:

import imaplib
import email
import quopri


mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login('mail@gmail.com', '*******')
mail.list()

mail.select('"[Gmail]/All Mail"') 



typ, data = mail.search(None, 'SUBJECT', '"{}"'.format('123456'))

data[0].split()

print(data[0].split())

for e_mail in data[0].split():
    typ, data = mail.fetch('{}'.format(e_mail.decode()),'(RFC822)')
    raw_mail = data[0][1]
    email_message = email.message_from_bytes(raw_mail)
    if email_message.is_multipart():
        for part in email_message.walk():
            if part.get_content_type() == 'text/plain':
                if part.get_content_type() == 'text/plain':
                    body = part.get_payload()
                    to = email_message['To']

                    utf = quopri.decodestring(to)

                    text = utf.decode('utf-8')
                    print(text)
.
.
.

我还是得到了这个:=?UTF-8?B?UMOpdGVyIFBldMWRY3o=?=

【问题讨论】:

  • 试一下。 'é'.encode().decode("utf-8")

标签: python-3.x encoding character-encoding


【解决方案1】:

这解决了它:

from email.header import decode_header
def mail_header_decoder(self,header):
        if header != None:
            mail_header_decoded = decode_header(header)
            l=[]  
            header_new=[]
            for header_part in mail_header_decoded: 
                l.append(header_part[1])

            if all(item == None for item in l):
                # print(header)
                return header
            else:
                for header_part in mail_header_decoded:
                    header_new.append(header_part[0].decode())
                header_new = ''.join(header_new) # convert list to string
                # print(header_new)
                return header_new

【讨论】:

    【解决方案2】:

    这就是所谓的“引用打印”编码。它由 RFC 1521 定义。其目的是将不寻常的字符值替换为一系列正常、安全的字符,以便电子邮件系统可以安全地处理邮件。

    实际上这里有两个编码级别。首先,字母'é' 被编码为产生'\xc3\xa9' 的UTF-8,然后UTF-8 被编码为带引号的可打印形式'=C3=A9'

    您可以使用quopri 模块的decodedecodestring 方法撤消引用打印步骤,记录在https://docs.python.org/3/library/quopri.html 中,如下所示:

        import quopri
    
        source = '=C3=A9'
        print(quopri.decodestring(source))
    

    这将撤消带引号的可打印编码并显示 UTF-8 字节 '\xc3\xa9'。要返回 'é' 字母,您需要使用 decode 字符串方法并告诉 Python 这些字节包含 UTF-8 编码,例如:

        utf = quopri.decodestring(source)
        text = utf.decode('utf-8')
        print(text)
    

    UTF-8 只是将字母编码为字节的众多可能方式中的一种。例如,如果您的 'é' 已被编码为 ISO-8859-1,则它的字节值将是 '\xe9',其引用的可打印表示将是 '=E9'

    当您处理电子邮件时,您应该会看到一个 Content-Type 标头,它告诉您正在发送什么类型的内容以及将哪种字母到字节编码应用于消息(或单个 MIME 部分,在多部分消息中)。如果该文本随后通过应用带引号的可打印编码再次编码,则该附加步骤应由 Content-Transfer-Encoding 标头指示。因此,您的带有 UTF-8 编码文本的消息以带引号的可打印格式进行应该具有如下所示的标题:

    Content-Type: text/plain; charset="utf-8"
    Content-Transfer-Encoding: quoted-printable
    

    【讨论】:

    • 谢谢ottomeister,你帮了很多忙。然而我又卡住了。我在上面的描述中添加了我的问题。我会非常感谢任何帮助!!!
    • 电子邮件标头中使用的格式称为“MIME 编码字”。它由 RFC 2047 定义。stackoverflow.com/questions/7331351/… 的答案解释了如何使用 Python 的 email.header 模块来解码那种头。
    • 再次感谢您。我昨天发现并写了一个小函数来解码标题项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 2022-11-03
    相关资源
    最近更新 更多