6

这可能是一个愚蠢的问题,但是……它来了!

我用本机 C++ 编写了自己的 MIME 解析器。这是编码的噩梦!过去 3 个月左右它很稳定,但最近我注意到了这一点Subject: header

Subject: =?UTF-8?B?T2ZpY2luYSBkZSBJbmZvcm1hY2nDs24sIEluaWNpYXRpdmFzIHkgUmVjbGFt?===?UTF-8?B?YWNpb25lcw==?=

这应该解码为:

Subject: Oficina de Información, Iniciativas y Reclamaciones

问题是那里有一个额外= (equal)的东西,我无法弄清楚我不明白为什么要分开的两个(为什么是 2 个?)编码元素的绑定。理论上格式应该是:=?charset?encoding?encoded_string?=但是发现另一个以两个开头的主题=

==?UTF-8?B?blahblahlblah?=

我应该如何处理额外的=

我可以在做任何事情之前替换==?=? (我是)(并且它有效) ......但我想知道是否有任何关于此的规范,所以我不会破解我的方式来获得正确的功能。

PS我多么讨厌这些遗物协议!所有文本通信都应该是 UTF-8 和 XML :)

4

3 回答 3

2

在 MIME 标头中使用编码字(RFC 2047 第 2 节)。

...(为什么是 2?)

克服 75 个编码字的限制,这是因为 78 行长度限制(或使用 2 种不同的编码,例如中文和波兰语)。

RFC 2047:

'encoded-word' 的长度不得超过 75 个字符,包括 'charset'、'encoding'、'encoded-text' 和分隔符。如果希望编码的文本多于 75 个字符的“编码字”,则可以使用多个“编码字”(由 CRLF SPACE 分隔)。

这是来自 RFC2047 的示例(注意中间没有“=”):

Subject: =?ISO-8859-1?B?SWYgeW91IGNhbiByZWFkIHRoaXMgeW8=?=
  =?ISO-8859-2?B?dSB1bmRlcnN0YW5kIHRoZSBleGFtcGxlLg==?=

您的主题应解码为:

"Oficina de Información, Iniciativas y Reclam=aciones"

mraq答案不正确。软换行符仅适用于“引用的可打印”内容传输编码,可用于 MIME 正文。

于 2016-01-21T16:59:54.957 回答
0

从我在MIME RFC中看到的双等号不是有效输入(用于编码),但请记住,您可以将第一个等号解释为它的含义,然后使用以下内容进行解码。但说真的,那些额外的等号看起来像是伪像,可能来自不正确的编码器。

于 2013-06-14T15:21:18.037 回答
0

它被称为“软换行符”,它是 SMTP 协议的遗产。

引用RFC2045第 20 页

(软换行符)Quoted-Printable 编码要求编码行的长度不超过 76 个字符。如果要使用 Quoted-Printable 编码对较长的行进行编码,则必须使用“软”换行符。编码行上最后一个字符的等号表示编码文本中的这种非重要(“软”)换行符。

还有Wikipedia on Quoted-printable

软换行符由编码行末尾的“=”组成,在解码文本中不显示为换行符。

于 2014-03-14T12:47:05.867 回答