Python: Что это за кодировка и как ее декодировать? - PullRequest
0 голосов
/ 26 ноября 2018

У меня много строк из почтовых тел, которые печатаются так:

=C3=A9

Это должно быть, например, 'é'.

Что это за кодировка и как ее декодировать?

Я использую python 3.5

РЕДАКТИРОВАТЬ:

Мне удалось получить телопочта, правильно закодированная с применением:

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

Однако я все еще изо всех сил пытаюсь получить правильные части ОТ, ДО, СУБЪЕКТА и т. д.

Вот как я создаю электронные письма:

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 голосов
/ 29 ноября 2018

Это решило это:

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
0 голосов
/ 27 ноября 2018

Это называется "цитируемой для печати" кодировки.Он определен в RFC 1521. Его цель - заменить необычные значения символов последовательностью нормальных, безопасных символов, чтобы сообщение могло безопасно обрабатываться системой электронной почты.

Фактически здесь существует два уровня кодирования,Сначала буква 'é' была закодирована в кодировке UTF-8, которая выдает '\xc3\xa9', а затем эта кодировка UTF-8 была закодирована в печатную форму в кавычках '=C3=A9'

.используя метод decode или decodestring модуля quopri, задокументированный в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...