将mime编码的电子邮件附件名称正确解码为unicode对象



为了简单明了,我有这样一个原始字符串,它是一个带有中文字符的过滤器:

=?utf-8?B5L+d56iO5LuT5Y+R6LSn5pel5oqlMS4xOS0xLjIxLnhsc3g=?=

根据http://dogmamix.com/MimeHeadersDecoder/,它的解码版本如下:

保税仓发货日报1.19-1.21.xlsx(右边)

我正在尝试对此进行解码以获得以下unicode字符串:

u'保税仓发货日报1.19-1.21.xlsx'

我在做什么:

步骤1:

in_str = '=?utf-8?B?5L+d56iO5LuT5Y+R6LSn5pel5oqlMS4xOS0xLjIxLnhsc3g=?='
from email.header import decode_header
res = decode_header(in_str)

然后res是以下形式的元组列表:

[('xe4xbfx9dxe7xa8x8exe4xbbx93xe5x8fx91xe8xb4xa7xe6x97xa5xe6x8axa51.19-1.21.xlsx', 'utf-8')]

是什么产生了一个问题——为什么res[0][0]部分是字节字符串,部分是普通原始字符串('1.19-1.21.xlsx'是字符串的原始部分)?但让我们继续。

步骤2。

让我们从utf-8解码这个字节串,因为我相信它是utf-8编码的字符串(逻辑的,对吧?)

filename = res[0][0].decode('utf-8')

我认为这应该返回以下unicode字符串:

u'保税仓发货日报1.19-1.21.xlsx'

但我得到了另一个字节串(这次是unicode):

u'u4fddu7a0eu4ed3u53d1u8d27u65e5u62a51.19-1.21.xlsx'

这让我抓狂,因为我相信我做的事情是对的。

顺便说一句,是的,我读过"Unicode HOWTO",仍然不知道如何修复它。

继续您的示例并使用支持字体字符的IDE:

#!python2
in_str = '=?utf-8?B?5L+d56iO5LuT5Y+R6LSn5pel5oqlMS4xOS0xLjIxLnhsc3g=?='
from email.header import decode_header
res = decode_header(in_str)
for data,enc in res:
print data.decode(enc)

输出:

保税仓发货日报1.19-1.21.xlsx

在Python 2中,您必须解码并打印字符串才能正确显示。

最新更新