Мне было предложено исправить ошибку в нашем почтовом программном обеспечении. Когда сообщение предметом которого кодируется в 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);
}
}
(The Base64
и Hex
классы в org.apache.commons.codec
)
Когда я запускаю его, вот вывод:
GyRCN1IkLCRDJEYbKEI=
繋がって
GyRCR1s/LiVGJTklSCEpRnxLXDhsGyhC
配信テスト?日本語
Первая, более короткая японская строка - это элемент управления, и это возвращает то же, что и вход, преобразованный в Base6 4 и обратно, используя Charset ISO-2022-JP. Все в порядке.
Вторая японская струна - одна с изворотливым персонажем. Как вы видите, он возвращается с? вместо персонажа. Выход кодировки Base64 также отличается от исходного кодирования объекта.
Извините, если это длинное, я хотел быть основательным. Что происходит, и как я могу правильно декодировать этого персонажа?
Попробуйте использовать «MS932» в кодировке. Средство private static final Charset CHARSET = Charset.forName ("MS932"); – AJJ
Вы пытались использовать SHIFT-JIS в качестве кодировки? –
Ну, но обычно вы должны конвертировать UTF-8 в Base64 ... это упростит. –