Python imaplib有时会返回如下所示的字符串:
=?utf-8?Q?Repertuar_wydarze=C5=84_z_woj._Dolno=C5=9Bl=C4=85skie?=
这种表示法的名称是什么?
如何解码(或者我应该说编码?)它到UTF8?
答案 0 :(得分:2)
简而言之:
>>> from email.header import decode_header
>>> msg = decode_header('=?utf-8?Q?Repertuar_wydarze=C5=84_z_woj._Dolno=C5=9Bl=C4=85skie?=')[0][0].decode('utf-8')
>>> msg
'Repertuar wydarze\u0144 z woj. Dolno\u015bl\u0105skie'
我的电脑没有显示波兰字符,但它们应该出现在您的(区域设置等)。
<强>解释强>
使用email.header
解码器:
>>> from email.header import decode_header
>>> value = decode_header('=?utf-8?Q?Repertuar_wydarze=C5=84_z_woj._Dolno=C5=9Bl=C4=85skie?=')
>>> value
[(b'Repertuar wydarze\xc5\x84 z woj. Dolno\xc5\x9bl\xc4\x85skie', 'utf-8')]
这将返回一个包含已解码标头的列表,通常包含一个元组,其中包含已解码的消息和检测到的编码(有时多于一对)。
>>> msg, encoding = decode_header('=?utf-8?Q?Repertuar_wydarze=C5=84_z_woj._Dolno=C5=9Bl=C4=85skie?=')[0]
>>> msg
b'Repertuar wydarze\xc5\x84 z woj. Dolno\xc5\x9bl\xc4\x85skie'
>>> encoding
'utf-8'
最后,如果您希望msg
作为普通的utf-8字符串,请使用字节decode
方法:
>>> msg = msg.decode('utf-8')
>>> msg
'Repertuar wydarze\u0144 z woj. Dolno\u015bl\u0105skie'
答案 1 :(得分:0)
您可以直接使用字节解码器,这是一个示例:
result, data = imapSession.uid('search', None, "ALL")
#search并返回uids
latest_email_uid = data[0].split()[-1]
#data []是一个列表,使用split()将它们按空格分隔并通过[-1]获取最新的
result, data = imapSession.uid('fetch', latest_email_uid, '(BODY.PEEK[])')
raw_email = data[0][1].decode("utf-8")
#using utf-8 decoder`