我正在尝试使用Python 3的bytes.decode(encoding)
解码一些电子邮件文本,其中encoding
来自电子邮件标头的charset
字段。
问题:某些电子邮件将'cp-850'列为字符集,而decode()
接受'cp850'。
如果我只是摆脱了连字符,那么另一个代码集(如iso-8859-6)将成为iso88596,这是无法识别的编码。
如何在不创建更多未知编码的情况下清除arg encoding
?
[编辑]后续问题:如何以email.message.Message
接受的格式(别名)从bytes.decode()
对象获取字符集?
[编辑]阐明了问题。以前我指的是字符集时,使用了不正确的术语“内容编码”。
答案 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'
还要令人迷惑地注意,别名如何带有下划线,然后将其映射为内部黑色巫毒术中的破折号。