gpt4 book ai didi

python - 如何用 python 解码这个附件文件名?

转载 作者:太空宇宙 更新时间:2023-11-04 01:08:43 25 4
gpt4 key购买 nike

我已经在我的代码中解码了很多电子邮件附件文件名。

但是这个特定的文件名破坏了我的代码。

这是一个最小的例子:

from email.header import decode_header
encoded_filename='=?UTF-8?B?U2FsZXNJbnZvaWNl?==?UTF-8?B?LVJlcG9ydC5wZGY=?='
decoded_header=decode_header(encoded_filename) # --> [('SalesInvoiceQ1|\x04\xb5I\x95\xc1\xbd\xc9\xd0\xb9\xc1\x91\x98', 'utf-8')]
filename=str(decoded_header[0][0]).decode(decoded_header[0][1])

异常(exception):

UnicodeDecodeError: 'utf8' codec can't decode byte 0xb5 in position 16: invalid start byte

别问我怎么做的,Thunderbird 能够将此文件名解码为:SalesInvoice-Report.pdf

我怎样才能像电子邮件客户端那样用 python 解码它?

最佳答案

两个 Encoded-Word该标题中的部分。您必须检测一个在哪里结束,一个在哪里开始:

>>> print  decode_header(encoded_filename[:28])[0]
('SalesInvoice', 'utf-8')
>>> print decode_header(encoded_filename[28:])[0]
('-Report.pdf', 'utf-8')

显然这就是 Thunderbird 在这种情况下所做的;将字符串拆分为 =?encoding?data?= block 。 通常这些应该用\r\n(CARRIAGE RETURN + LINE FEED)字符分隔,但在您的情况下它们被混在一起。如果您重新引入 \r\n 分隔符,值将正确解码:

>>> decode_header(encoded_filename[:28] + '\r\n' + encoded_filename[28:])[0]
('SalesInvoice-Report.pdf', 'utf-8')

您可以使用正则表达式来提取部分并重新引入分隔符:

import re
from email.header import decode_header

quopri_entry = re.compile(r'=\?[\w-]+\?[QB]\?[^?]+?\?=')

def decode_multiple(encoded, _pattern=quopri_entry):
fixed = '\r\n'.join(_pattern.findall(encoded))
output = [b.decode(c) for b, c in decode_header(fixed)]
return ''.join(output)

演示:

>>> encoded_filename = '=?UTF-8?B?U2FsZXNJbnZvaWNl?==?UTF-8?B?LVJlcG9ydC5wZGY=?='
>>> decode_multiple(encoded_filename)
u'SalesInvoice-Report.pdf'

当然,可能是您一开始阅读标题的方式存在错误。确保在提取 encoded_filename 值时不会意外破坏现有的 \r\n 分隔符。

关于python - 如何用 python 解码这个附件文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28985743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com