Euro-Sign 未正确引用可打印编码

Euro-Sign is not properly Quoted-Printable encoded

我们正在尝试编码 NonBreaking-Space (0xC2 0xA0) 和 Euro-Sign (0xE2 0x82 0xAC) 使用 Spring MimeMessageHelper setText https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/mail/javamail/MimeMessageHelper.html#setText-java.lang.String-java.lang.String-

对于 html-body,我们得到输出 =C2=A0?,这是正确的 space 后跟替换字符 '?'。

From: nix@foo.de
Reply-To: valid@foo.de
To: valid@foo.de
Message-ID: <935520971.3.1574258294133@hp-machine>
Subject: testing email
MIME-Version: 1.0
Content-Type: multipart/mixed; 
    boundary="----=_Part_0_1089341986.1574258294045"

------=_Part_0_1089341986.1574258294045
Content-Type: multipart/related; 
    boundary="----=_Part_1_801142660.1574258294066"

------=_Part_1_801142660.1574258294066
Content-Type: multipart/alternative; 
    boundary="----=_Part_2_685219002.1574258294091"

------=_Part_2_685219002.1574258294091
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: base64

MjgsNDDCoOKCrA==
------=_Part_2_685219002.1574258294091
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

28,40=C2=A0?
------=_Part_2_685219002.1574258294091--

------=_Part_1_801142660.1574258294066--

------=_Part_0_1089341986.1574258294045--

知道为什么会发生这种情况吗?

该行为实际上植根于 javax.mail 包中,执行一些编码检测巫术并最终导致该行为。如果显式设置 utf-8 字符集从而避免自动检测,内容甚至会采用 base64 编码。

我们现在确实采用了一种解决方法,将 unicode 代码点显式编码为 html 实体以用于 html 附件。 我们所有的 unicode-codepoints 都以这种方式编码,javax.mail 会将整个内容视为 us-ascii 并且根本不进行任何特殊编码。