【发布时间】:2019-02-19 12:55:10
【问题描述】:
python2.7 或 python3 的 Python 电子邮件标头解码器在编码和未编码文本之间切换时似乎有一些奇怪的行为。
from email.header import decode_header
print decode_header("=?ISO-8859-1?B?QA==?=example.com");
print decode_header("=?ISO-8859-1?B?QA==?= example.com");
print decode_header("=?ISO-8859-1?Q?=40example?= .com");
print decode_header("=?ISO-8859-1?Q?=40example?=.com");
这是结果
[('=?ISO-8859-1?B?QA==?=example.com', None)]
[('@', 'iso-8859-1'), ('example.com', None)]
[('@example', 'iso-8859-1'), ('.com', None)]
[('=?ISO-8859-1?Q?=40example?=.com', None)]
在所有示例输入中,编码文本只是 @ 符号,它应该得到正确解释,但事实并非如此。我认为 RFC 1342 的解释对我来说似乎不正确。 Python 期望空格或换行符作为编码文本的结尾。我在 RFC 中没有看到这一点,RFC 只说在我阅读它时多个编码文本之间需要空间,而不是在文本的编码文本和未编码部分之间需要空间。因此,每当您看到“?=”时,您都需要将其视为 Python 不做的编码文本的结尾。我想问专家这是否是这里的错误或者我是否弄错了?
维杰
【问题讨论】:
-
您的问题只能在 Python 2.7 中重现。我在 3.x 中运行了您的代码并得到了正确的结果。一定是2.7的bug。作为旁注,不要在行尾添加分号,它们在任何版本的 Python 中都不是必需的。
-
更正我之前的评论:显然,2.7 产生了正确的结果,但 3.x 没有。
标签: python python-2.7 email-headers