将Unicode更改为Str返回“不支持”

时间:2019-03-27 06:06:11

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

在程序代码中返回“未定义unicode”。从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 :(得分:0)

Python 3中不存在unicode内置函数-这就是为什么您会得到异常NameError: name 'unicode' is not defined的原因。在Python 3中,unicode的等效项是str

unicode一样,str接受一个编码参数,并将尝试使用提供的编码来解码字节串。如果将str实例传递给str进行解码,则会得到TypeError: decoding str is not supported

email.header.decode_header的输出可能同时包含strbytes实例,因此您的理解需要能够处理这两个实例:

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'

(消息数据来自电子邮件examples)。