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'
還應注意的是,別名令人困惑地是如何有一個下劃線,然后該下劃線被映射為某些內部黑色巫毒魔法中的短劃線。
添加回答
舉報