Encoding MIME电子邮件主题等标题与utf8:先拆分,然后编码?

Encoding MIME电子邮件主题等标题与utf8:先拆分,然后编码?,encoding,utf-8,base64,email-headers,mime-mail,Encoding,Utf 8,Base64,Email Headers,Mime Mail,让我们以这个主题为例 $ echo -n 台電用戶意見電子信箱-信件受 | base64 5Y+w6Zu755So5oi25oSP6KaL6Zu75a2Q5L+h566xLeS/oeS7tuWPlw== 它(连同“主题:”等)在编码时超过了标准。所以 一些邮递员(某电力公司的)首先对其进行编码,然后将其拆分: Subject: =?utf-8?B?5Y+w6Zu755So5oi25oSP6KaL6Zu75a2Q5L+h566xLeS/oeS7?= =?utf-8?B?tuWPl+eQhumA

让我们以这个主题为例

$ echo -n 台電用戶意見電子信箱-信件受 | base64
5Y+w6Zu755So5oi25oSP6KaL6Zu75a2Q5L+h566xLeS/oeS7tuWPlw==
它(连同“主题:”等)在编码时超过了标准。所以 一些邮递员(某电力公司的)首先对其进行编码,然后将其拆分:

Subject: =?utf-8?B?5Y+w6Zu755So5oi25oSP6KaL6Zu75a2Q5L+h566xLeS/oeS7?=
 =?utf-8?B?tuWPl+eQhumAmuefpQ==?=
(但这可能很容易“断开”UTF-8多字节字符。)

其他邮件发送者(如GNU)首先将其拆分,然后对其进行编码:

Subject: =?utf-8?B?5Y+w6Zu755So5oi25oSP6KaL6Zu75a2Q5L+h566xLeS/oeS7tg==?=
 =?utf-8?B?5Y+X55CG6YCa55+l?=
后者保证在的所有邮件阅读器中正确呈现 今天

我的问题是,一些邮件阅读器(如Gmail)的错误是谁 安卓应用程序)被前者卡住了吗

邮件阅读器是否应该首先将两个字符串粘贴在一起,然后 解码(所以Gmail应用程序是错误的。)

或者也可以先解码,然后将两个解码的字符串粘贴在一起。 (那么mailer软件是错的?)

(我假设同样的问题也发生在引用的Printable上,而不仅仅是Base64。)

事实上,如果你仔细想想,说
=?utf-8?B?=
意味着
.
东西应该是一个有效的utf-8字符串,
(就其本身而言,)对吗?所以mailer软件是错误的

类似地,可能从来没有定义过如何将
=?utf-8?B?..?=
拆分为两个短语的语法,因为这应该事先处理,因为创建
=?utf-8?B?..?=
字符串应该始终是最后一步


所以:梅勒软件:有罪。Gmail:无罪。

您所拥有的是中定义的
编码单词
语法。您可以混合使用未编码的标记和各种编码,以便每个编码的单词本身都是有效的。先解码,然后合并看起来是正确的方法

阅读RFC,一些注释和示例与您的案例相关

当然,RFC介绍中的注释“虽然很不幸……”告诉您,整个区域总是一团糟。

根据per的示例(以及总体解释),一个编码单词不会神奇地跨越多个实例:

  • =?UTF-8?Q?a?=
    既不能继续前面的编码字,也不能继续后面的编码字-它是什么:
    a
  • 当我们混合使用文本编码时,这一点更为明显:
    =?UTF-8?Q?a?==?ISO-8859-1?Q?b?=
    应呈现为
    ab
    ,很明显,当下一个编码字再次是UTF-8时,在两者之间剪切UTF-8只会起到一半的作用(而不同的文本编码肯定使用不同的字节)
作为逻辑结果,UTF-8应该按字符而不是字节分割。这意味着:编码B(Base64)和Q(引号)都不应该被剪切(除非剪切同时发生在编码文本的字符之间)-剪切必须在之前发生


我只能猜测这对一些程序员来说“太复杂了”,他们只是认为“无论如何,它不会破坏任何东西——到目前为止,没有人抱怨”。但是如果一个编码的单词必须被剪切,正确的方法是首先对它进行解码,这样文本就可以按字符(而不是按字节)进行剪切,然后再对这两部分进行编码。一个警告是:谁这样做也必须支持上述文本编码——虽然UTF-8在今天很流行,但软件是否也知道在哪里剪切和删除呢?

OK:Gmail:有罪。梅勒·索弗瓦:无罪。或者:“至少Gmail可以更宽容一些。”明白了!梅勒软件:有罪。Gmail:无罪。是的,RFC的例子说“每个‘编码单词’必须是独立的”!Per gnus不会帮助更早地找到bug。我需要Gmail。