猿问

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

我正在尝试使用 Python 3's 解码一些电子邮件文本bytes.decode(encoding),其中encoding来自charset电子邮件标题的字段。

问题:一些电子邮件将“cp-850”列为他们的字符集,同时decode()接受“cp850”。

如果我只是去掉连字符,那么另一个像 iso-8859-6 这样的代码集就会变成 iso88596,这是一种无法识别的编码。

如何在encoding不创建更多未知编码的情况下清理 arg ?

[编辑] 后续问题:如何email.message.Message以 接受的格式(别名)从对象中获取字符集bytes.decode()

[编辑] 澄清了问题。以前当我指的是字符集时使用了错误的术语“内容编码”。


慕丝7291255
浏览 243回答 2
2回答

红糖糍粑

该email.charset模块包含从IANA字符集标签到Python内部使用的别名的映射; 但是有可能您根本不需要自己做.这是Python文档中该模块的“示例”页面中的示例的改编本emailimport emailfrom email.policy import defaultwith 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 helpimport email.charset as email_charsetemail_charset.add_alias('cp-850', 'cp850')相反,您必须破解Python的encodings模块以支持该别名:import encodingsencodings.aliases.aliases['cp_850'] = 'cp850'还应注意的是,别名令人困惑地是如何有一个下划线,然后该下划线被映射为某些内部黑色巫毒魔法中的短划线。
随时随地看视频慕课网APP

相关分类

Python
我要回答