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

时间:2017-02-08 12:20:46

标签: python python-2.7 email unicode mime

简单明了,我有这样的原始字符串,这是一个带有汉字的电影:

=?UTF-8 2 B 4 5L + 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是以下形式的元组列表:

[('\xe4\xbf\x9d\xe7\xa8\x8e\xe4\xbb\x93\xe5\x8f\x91\xe8\xb4\xa7\xe6\x97\xa5\xe6\x8a\xa51.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'\u4fdd\u7a0e\u4ed3\u53d1\u8d27\u65e5\u62a51.19-1.21.xlsx'

这让我感到疯狂,因为我相信我做得对。

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

1 个答案:

答案 0 :(得分:1)

继续您的示例并使用支持字体字符的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中,您必须解码并打印字符串才能正确显示。