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

时间:2018-08-22 03:22:18

标签: python email encoding character-encoding

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

问题:某些电子邮件将'cp-850'列为字符集,而decode()接受'cp850'。

如果我只是摆脱了连字符,那么另一个代码集(如iso-8859-6)将成为iso88596,这是无法识别的编码。

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

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

[编辑]阐明了问题。以前我指的是字符集时,使用了不正确的术语“内容编码”。

2 个答案:

答案 0 :(得分:0)

您可以删除连字符并检查是否存在支持结果编码的编解码器:

for i = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

答案 1 :(得分:0)

email.charset module包含从IANA字符集标签到Python内部使用的别名的映射;但是很有可能您根本不需要自己做这个事情。

这里是email module's Examples page in the Python documentation

中示例的改编
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')

相反,您必须hack Python's encodings module to support this alias

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

还要令人迷惑地注意,别名如何带有下划线,然后将其映射为内部黑色巫毒术中的破折号。