Parsing 带有额外'=';(==?utf-8?b?base64string?=)

Parsing 带有额外'=';(==?utf-8?b?base64string?=),parsing,encoding,character-encoding,protocols,mime,Parsing,Encoding,Character Encoding,Protocols,Mime,这可能是一个愚蠢的问题,但。。。来了 我在自己的C++中编写了自己的MIME解析器。这是一场有编码的噩梦!在过去3个月左右的时间里,它是稳定的,但最近我注意到了这个主题:header Subject: =?UTF-8?B?T2ZpY2luYSBkZSBJbmZvcm1hY2nDs24sIEluaWNpYXRpdmFzIHkgUmVjbGFt?===?UTF-8?B?YWNpb25lcw==?= 应将其解码为: Subject: Oficina de Información, Iniciativ

这可能是一个愚蠢的问题,但。。。来了

我在自己的C++中编写了自己的MIME解析器。这是一场有编码的噩梦!在过去3个月左右的时间里,它是稳定的,但最近我注意到了这个

主题: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:)

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

它被称为“软换行”,它是SMTP协议的传统

引用第20页,共页

(软换行符)引用的可打印编码 要求编码行不超过76行 字符长。如果要对较长的行进行编码 使用引用的可打印编码,“软”换行 必须使用。等号,等号作为字符表上最后一个字符的等号 编码行表示这样一个不重要的(“软”) 编码文本中的换行符

而且

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


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

。。。(为什么是2?)

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

RFC 2047:

“编码字”的长度不得超过75个字符, 包括“字符集”、“编码”、“编码文本”和分隔符。 如果希望编码的文本多于一个文本中的文本 75个字符的“编码字”,多个“编码字” (由CRLF空格分隔)可以使用

以下是RFC2047中的示例(注意,两者之间没有“=”):

您的主题应解码为:

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

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

我也这么认为。我在5封来自不同来源的电子邮件中看到了它们,我认为这是我遗漏的东西。还有什么比这样问更好的地方):这个答案是错误的。将“引用可打印”内容传输编码(RFC 2045)与“Q编码”编码字(RFC 2047)混淆。上述主题应解读为“Oficina de Información,Iniciativas y Reclam=aciones”
"Oficina de Información, Iniciativas y Reclam=aciones"