gpt4 book ai didi

java - Base64 中的日语字符编码

转载 作者:行者123 更新时间:2023-11-30 07:12:36 25 4
gpt4 key购买 nike

我被要求修复我们的电子邮件处理软件中的一个错误。当主题编码为 RFC 2047 的消息时像这样:

=?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);
}

}

(Base64Hex 类在 org.apache.commons.codec 中)

当我运行它时,输出如下:

GyRCN1IkLCRDJEYbKEI=
繋がって
GyRCR1s/LiVGJTklSCEpRnxLXDhsGyhC
配信テスト?日本語

第一个较短的日文字符串是一个控件,它返回与输入相同的内容,已使用 Charset ISO-2022-JP 转换为 Base64 并再次转换回来。那里一切都好。

第二个日语字符串是带有狡猾字符的字符串。如您所见,它返回一个 ?而不是角色。 Base64 编码输出也与原始主题编码不同。

对不起,如果这很长,我想说的很透彻。这是怎么回事,我该如何正确解码这个字符?

最佳答案

错误不在您的软件中,而是主题字符串本身的编码不正确。其他软件可能能够通过对内容进行进一步假设来解码文本,就像通常假设 0x80-0x9f 范围内的字符是 Cp1252 编码一样,尽管指定了 ISO-8859-1 或 ISO-8859-15 .

ISO-2022-JP 是一种多字符集编码,使用转义序列在实际使用的字符集之间切换。您的编码字符串以 ESC $ B 开头,表示使用了 JIS X 0208-1983 字符集。违规字符编码为 0x2d6a。该代码点未在引用的字符集中定义,但后来添加到 JIS X 0213:2000,这是 JIS X 字符集规范的更新版本。

关于java - Base64 中的日语字符编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20240836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com