Mime编码标头带有'='(==?utf-8?b?base64string?=)

时间:2013-06-13 18:01:34

标签: parsing encoding character-encoding protocols mime

这可能是一个愚蠢的问题,但......就在这里!

我在本机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:)

3 个答案:

答案 0 :(得分:2)

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

  

......(为什么2?)

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

RFC 2047:

  

'编码字'长度不得超过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 回答不正确。软换行符仅适用于“Quoted Printable”Content-Transfer-Encoding,可以在MIME正文中使用。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

它被称为" Soft Line Break "它是SMTP协议的遗产。

引用RFC2045

的第20页
  

(Soft Line Breaks)Quoted-Printable编码             要求编码行不超过76行             长字符。如果要编码更长的行             使用Quoted-Printable编码," soft"换行             必须使用。一个等号作为a的最后一个字符             编码行表示这种不重要的(" soft")             编码文本中的换行符。

还有Wikipedia on Quoted-printable

  

软换行包含" ="在编码行的末尾,   并且不会在解码文本中显示为换行符。