Python:这种编码是什么以及如何解码?

时间:2018-11-26 16:53:31

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

我有很多来自邮件正文的字符串,其打印方式如下:

=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 =?=

2 个答案:

答案 0 :(得分:1)

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

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

您可以使用https://docs.python.org/3/library/quopri.html中记录的decode模块的decodestringquopri方法撤消带引号的可打印步骤,该过程类似于:

    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

答案 1 :(得分:0)

这解决了它:

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