用Java解码Mail.app电子邮件附件文件名

ada*_*amw 7 java macos mime jakarta-mail

我在解码电子邮件附件的文件名方面遇到了问题.目前我正在使用JavaMail 1.4.2.该文件名为"Żółw.rtf"(这是Turtle.rtf的润色).邮件是使用Mail.app发送的(这看起来非常重要).重要的标题是:

--Apple-Mail-19-721116558
Content-Disposition: attachment;
   filename*=utf-8''Z%CC%87o%CC%81%C5%82w.rtf
Content-Type: text/rtf;
   x-unix-mode=0644;
   name="=?utf-8?Q?Z=CC=87o=CC=81=C5=82w=2Ertf?="
Content-Transfer-Encoding: 7bit
Run Code Online (Sandbox Code Playgroud)

相应的javax.mail.Part.getFileName()返回"=?utf-8?Q?Z = CC = 87o = CC = 81 = C5 = 82w = 2Ertf?=",在应用MimeUtility.decodeText后,它是: "ZÃáoÃÅ≈Çw.rtf".显然不是原来:).

为了比较,MimeUtility.encodeText返回:

=?UTF-8?Q?=C5=BB=C3=B3=C5=82w.rtf?=
Run Code Online (Sandbox Code Playgroud)

相比之下:

=?utf-8?Q?Z=CC=87o=CC=81=C5=82w=2Ertf?=
Run Code Online (Sandbox Code Playgroud)

来自电子邮件.

根据我的研究,字母"Ż"可以用两种方式编码:作为单个字母或"Z"+以上点.MimeUtility.encodeText使用前者,Mail.app使用后者.

但是我希望能够解码两者.有没有办法解码使用JavaMail从Mail.app发送的文件名?或者也许还有其他一些图书馆?

谢谢!亚当

ada*_*amw 12

事实证明你必须规范化字符串:

String decoded = MimeUtility.decodeText(part.getFileName()); 
return Normalizer.normalize(decoded, Normalizer.Form.NFC); 
Run Code Online (Sandbox Code Playgroud)

很奇怪,但有效!:)更详细地说,由于Mail.app将"Ż"编码为两个字符:"Z"+"dot-above",然后必须使用Normalizer重新组合.

亚当