如何处理来自Pythons imaplib的UTF8字符串

时间:2016-09-11 19:41:56

标签: python utf-8 imaplib

Python imaplib有时会返回如下所示的字符串:

=?utf-8?Q?Repertuar_wydarze=C5=84_z_woj._Dolno=C5=9Bl=C4=85skie?=

这种表示法的名称是什么?

如何解码(或者我应该说编码?)它到UTF8?

2 个答案:

答案 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`

相关问题