为了账号安全,请及时绑定邮箱和手机立即绑定

使用 bytes.decode(encoding) 解码电子邮件文本

使用 bytes.decode(encoding) 解码电子邮件文本

慕丝7291255 2021-05-31 04:12:57
我正在尝试使用 Python 3's 解码一些电子邮件文本bytes.decode(encoding),其中encoding来自charset电子邮件标题的字段。问题:一些电子邮件将“cp-850”列为他们的字符集,同时decode()接受“cp850”。如果我只是去掉连字符,那么另一个像 iso-8859-6 这样的代码集就会变成 iso88596,这是一种无法识别的编码。如何在encoding不创建更多未知编码的情况下清理 arg ?[编辑] 后续问题:如何email.message.Message以 接受的格式(别名)从对象中获取字符集bytes.decode()?[编辑] 澄清了问题。以前当我指的是字符集时使用了错误的术语“内容编码”。
查看完整描述

2 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

该email.charset模块包含从IANA字符集标签到Python内部使用的别名的映射; 但是有可能您根本不需要自己做.


这是Python文档中该模块的“示例”页面中的示例的改编本email


import email

from email.policy import default


with open('/path/to/file', 'rb') as fp:

    msg = email.message_from_binary_file(fp, policy=default)


for part in msg.walk():

    # multipart/* are just containers

    if part.get_content_maintype() == 'multipart':

        continue

    charset = part.get_content_charset()

    if charset is not None:

        print('=== charset {} ==='.format(charset))

        print(part.get_content())

这将为您提供部件字符集的 IANA 字符集标签;但是(默认情况下email.policy)文本有效负载将已为您解码为 Unicode,因此您根本不需要自己转换它。


该email库已在Python 3.5中正式进行了检修(在Python 3.3中已经非正式地进行了检修),并使用了基于策略的系统,该系统允许您在确实需要时接管消息解析的某些部分;但是对于格式正确的符合标准的消息(以及一些常见的突变),您可以放心让Python标准库为您完成工作。


但是,正如您所指出的cp-850,正是由于您陈述的原因,该代码实际上无法与身体部位一起使用。你会期望这会起作用,但它不会:


# FIXME: broken code, doesn't help

import email.charset as email_charset

email_charset.add_alias('cp-850', 'cp850')

相反,您必须破解Python的encodings模块以支持该别名:


import encodings

encodings.aliases.aliases['cp_850'] = 'cp850'

还应注意的是,别名令人困惑地是如何有一个下划线,然后该下划线被映射为某些内部黑色巫毒魔法中的短划线。


查看完整回答
反对 回复 2021-06-01
  • 2 回答
  • 0 关注
  • 242 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信