亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 bytes.decode(encoding) 解碼電子郵件文本

使用 bytes.decode(encoding) 解碼電子郵件文本

慕絲7291255 2021-05-31 04:12:57
我正在嘗試使用 Python 3's 解碼一些電子郵件文本bytes.decode(encoding),其中encoding來自charset電子郵件標題的字段。問題:一些電子郵件將“cp-850”列為他們的字符集,同時decode()接受“cp850”。如果我只是去掉連字符,那么另一個像 iso-8859-6 這樣的代碼集就會變成 iso88596,這是一種無法識別的編碼。如何在encoding不創建更多未知編碼的情況下清理 arg ?[編輯] 后續問題:如何email.message.Message以 接受的格式(別名)從對象中獲取字符集bytes.decode()?[編輯] 澄清了問題。以前當我指的是字符集時使用了錯誤的術語“內容編碼”。
查看完整描述

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'

還應注意的是,別名令人困惑地是如何有一個下劃線,然后該下劃線被映射為某些內部黑色巫毒魔法中的短劃線。


查看完整回答
反對 回復 2021-06-01
  • 2 回答
  • 0 關注
  • 284 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號