我被要求修復我們的電子郵件處理軟件中的錯誤。 當一個消息,其主題被編碼在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 ...這會讓它變得更容易。 –