最近用 Python 的 imaplib 和 email 从一个 gmail 信箱中取信。
因为信可能有很多,而我只想取特定发件人发来的信,所以就只先取信头(通过类似 rv, data = self.M.fetch(num, '(BODY[HEADER])') 的方式),如果发件人符合,再取整封信(rv, data = self.M.fetch(num, '(RFC822)'))。
于是我就遇到了这么样封信。如果我只取信头,那么取到的信件发件人是:
'"\xce\xa2\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xc5\xb6\xef\xbf\xbd" '
它是乱码:
>>> print '"\xce\xa2\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xc5\xb6\xef\xbf\xbd" '.decode("gbk")
"微锟斤拷锟脚讹拷"
而如果取整封信,则信件标题是:
'"\xce\xa2\xd0\xc5\xcd\xc5\xb6\xd3" '
这个标题则是正常的:
>>> print '"\xce\xa2\xd0\xc5\xcd\xc5\xb6\xd3" '.decode("gbk")
"微信团队"
这个乱码,可以这么重现……
把这个字串直接(应该是用 utf-8 解码)印到控制台里,然后把输出的内容再用 utf-8 编码一遍,就变成了那第一串长字符串;特别地,\xef\xbf\xbd 其实就是 utf-8 编码的“问号标志”�
>>> print '"\xce\xa2\xd0\xc5\xcd\xc5\xb6\xd3" '
"���Ŷ�"
>>> '"���Ŷ�" '
'"\xce\xa2\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xc5\xb6\xef\xbf\xbd" '
不知大家遇到过一样的情况吗?