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'
还应注意的是,别名令人困惑地是如何有一个下划线,然后该下划线被映射为某些内部黑色巫毒魔法中的短划线。
添加回答
举报