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

2024-06-09 14:21:15 发布

您现在位置:Python中文网/ 问答频道 /正文

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

=?utf-8?B?5L+d56iO5LuT5Y+R6LSN5EL5OQLMS4xOS0xLJIXLNHSC3G=?=

根据http://dogmamix.com/MimeHeadersDecoder/,它的装饰版本如下所示:

你知道吗保税仓发货日报1.19-1.21.xlsx(右)

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

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

我要做的是:

第一步:

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]部分是bytestring,部分是普通的原始字符串('1.19-1.21.xlsx'是字符串的原始部分)?但让我们继续

第二步

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

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

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

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

但是我得到了另一个bytestring(这次是unicode):

u'\u4fdd\u7a0e\u4ed3\u53d1\u8d27\u65e5\u62a51.19-1.21.xlsx'

这让我发疯,因为我相信我做的事情是对的

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


Tags: 字符串inunicoderes解码xlsxutfheader
1条回答
网友
1楼 · 发布于 2024-06-09 14:21:15

继续您的示例并使用支持字体字符的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

在python2中,必须解码并打印字符串才能正确显示

相关问题 更多 >