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

use*_*761 5 python utf-8 imaplib

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

=?utf-8?Q?Repertuar_wydarze=C5=84_z_woj._Dolno=C5=9Bl=C4=85skie?=
Run Code Online (Sandbox Code Playgroud)

这个符号的名称是什么?

如何将其解码(或者应该说编码?)为 UTF8?

Uri*_*iel 3

简而言之:

>>> 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'
Run Code Online (Sandbox Code Playgroud)

我的计算机不显示波兰语字符,但它们应该出现在您的计算机中(区域设置等)


解释:

使用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')]
Run Code Online (Sandbox Code Playgroud)

这将返回一个包含已解码标头的列表,通常包含一个包含已解码消息和检测到的编码的元组(有时不止一对)。

>>> 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'
Run Code Online (Sandbox Code Playgroud)

最后,如果你想要msg一个普通的 utf-8 字符串,请使用 bytesdecode方法:

>>> msg = msg.decode('utf-8')
>>> msg
'Repertuar wydarze\u0144 z woj. Dolno\u015bl\u0105skie'
Run Code Online (Sandbox Code Playgroud)