将 mime 编码的电子邮件附件名称正确解码为 unicode 对象
Properly decoding a mime encoded email attachament name to unicode object
简单明了,我有这样的原始字符串,这是一个带有汉字的filneme:
=?utf-8?B?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')
我相信这应该 return 以下 unicode 字符串:
u'保税仓发货日报1.19-1.21.xlsx'
但我得到了另一个字节串(这次是 unicode):
u'\u4fdd\u7a0e\u4ed3\u53d1\u8d27\u65e5\u62a51.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 中,您必须解码并打印字符串才能正确显示。
简单明了,我有这样的原始字符串,这是一个带有汉字的filneme:
=?utf-8?B?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')
我相信这应该 return 以下 unicode 字符串:
u'保税仓发货日报1.19-1.21.xlsx'
但我得到了另一个字节串(这次是 unicode):
u'\u4fdd\u7a0e\u4ed3\u53d1\u8d27\u65e5\u62a51.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 中,您必须解码并打印字符串才能正确显示。