我被要求修复我们的电子邮件处理软件中的错误。 当一个消息,其主题被编码在RFC 2047这样的:接收Base64中的日文字符编码
=?ISO-2022-JP?B?GyRCR1s/LiVGJTklSC1qRnxLXDhsGyhC?=
,它被不正确地解码 - 日语字符中的一个被不正确地呈现。它是这样呈现的:配信テスト?日本语,当它应该是配信テスト㈱日本语 (我不明白日语) - 显然一个字符,看起来在括号内,没有被渲染。
的解码是通过javax.mail.internet.MimeUtility.decodeText()
进行。如果我一上线译码器(唯一一个我发现是here)尝试似乎工作好了,所以我在MimeUtility
怀疑的错误。
所以我尝试了一些实验,在这个小程序的形式:
public class Encoding {
private static final Charset CHARSET = Charset.forName("ISO-2022-JP");
public static void main(String[] args) throws UnsupportedEncodingException {
String control = "繋がって";
String subject= "配信テスト㈱日本語";
String controlBase64 = japaneseToBase64(control);
System.out.println(controlBase64);
System.out.println(base64ToJapanese(controlBase64));
String subjectBase64 = japaneseToBase64(subject);
System.out.println(subjectBase64);
System.out.println(base64ToJapanese(subjectBase64));
}
private static String japaneseToBase64(String in) {
return Base64.encodeBase64String(in.getBytes(CHARSET));
}
private static String base64ToJapanese(String in) {
return new String(Base64.decodeBase64(in), CHARSET);
}
}
(该Base64
和Hex
类是org.apache.commons.codec
)
当我运行它,这里的输出:
GyRCN1IkLCRDJEYbKEI=
繋がって
GyRCR1s/LiVGJTklSCEpRnxLXDhsGyhC
配信テスト?日本語
第一个较短的日文字符串是一个控件,它返回与输入相同的内容,已被转换为Base6 4,然后再使用Charset ISO-2022-JP。那里一切OK。
第二个日文字符串是具有狡猾字符的字符串。如你所见,它会返回一个?而不是角色。 Base64编码输出也与原始主体编码不同。
对不起,如果这很长,我想彻底。发生了什么,以及如何正确解码这个字符?
尝试在编码中使用“MS932”。意思是私有静态最终字符集CHARSET = Charset.forName(“MS932”); – AJJ
你尝试过使用SHIFT-JIS作为字符集吗? –
嗯,但通常你应该将UTF-8转换为Base64 ...这会让它变得更容易。 –