Изменение Unicode на Str возвращает «не поддерживается» - PullRequest
0 голосов
/ 27 марта 2019

В коде программы возвращено «unicode is notfined». Переход от unicode к str возвращает «str не поддерживается». Что не так или нет?

for header in [ 'subject' ]:
    dh = email.header.decode_header(msg[header])
    default_charset = 'ASCII'
    print('%-8s: %s' % (header.upper(), ''.join([ unicode(t[0], t[1] or default_charset) for t in dh ])))

1 Ответ

0 голосов
/ 28 марта 2019

Встроенная функция unicode не существует в Python 3 - поэтому вы получаете исключение NameError: name 'unicode' is not defined. В Python 3 эквивалент unicode равен str .

Как и unicode, str принимает аргумент кодирования и пытается декодировать строку байтов, используя предоставленную кодировку. Если вы передадите экземпляр str в str для декодирования, вы получите TypeError: decoding str is not supported.

Вывод email.header.decode_header может включать в себя оба экземпляра str и bytes, поэтому ваше понимание должно быть в состоянии обрабатывать оба:

print('%-8s: %s' % ('subject'.upper(), ''.join(t[0] if isinstance(t[0], str) else str(t[0], t[1] or default_charset) for t in dh)))

(В Python 3, вероятно, лучше установить default_charset в 'utf-8').

Наконец, если вы контролируете, как создается объект сообщения, вы можете автоматически декодировать заголовки, указав объект политики при создании сообщения (Python 3.5+).

>>> from email.policy import default
>>> with open('message.eml', 'rb') as f:
...     msg = email.message_from_bytes(f.read(), policy=default)
>>>

>>> for x in msg.raw_items():print(x)
... 
('Subject', 'Ayons asperges pour le =?utf-8?q?d=C3=A9jeuner?=')
('From', '=?utf-8?q?Pep=C3=A9?= Le Pew <pepe@example.com>')
('To', 'Penelope Pussycat <penelope@example.com>,\n Fabrette Pussycat <fabrette@example.com>')
('Content-Type', 'text/plain; charset="utf-8"')
('Content-Transfer-Encoding', 'quoted-printable')
('MIME-Version', '1.0')
>>> msg['from']
'Pepé Le Pew <pepe@example.com>'
>>> msg['subject']
'Ayons asperges pour le déjeuner'

(Данные сообщения взяты из электронного письма примеров ).

...