无法使用字符集 iso-2022-jp 解码单个日文汉字字符

Unable to decode a single Japanese kanji character using character set iso-2022-jp

我正在处理用日语写的客户电子邮件。有些 HTML 主体使用字符集 iso-2022-jp 编码。我发现一个奇怪的场景,我无法使用字符集 iso-2022-jp 解码单个日文汉字字符。

重现问题的示例代码:

final String z = "髙";
final Charset charset = Charset.forName("iso-2022-jp");
final byte[] byteArr = z.getBytes(charset);
final String z2 = new String(byteArr, charset);
System.out.println(z);  // prints "髙"
System.out.println(z2);  // prints "?"

如果我使用字符集“utf-8”,它工作正常。

说清楚,我绝对确定这里的字符是Unicode字符U+9AD9. This is a common character in Japanese text, e.g., Takashimaya dept store:高岛屋。上面的代码将正确 encode/decode 最后两个字符:岛和屋。

我 99.99% 确定我在使用 decode/encode API 不正确。我做错了什么?

最后,我正在使用最新的 JDK11 在 Windows7 上使用 IntelliJ 2020 进行调试。我还定期处理日语文本,所以我知道我的字体设置正常。

更新

感谢您的宝贵意见。

  1. 我没注意到这个汉字是更常见的高 (U+9AD8) 的“变体”。我的字体太小了,没注意到。
  2. 客户办公地址为东京日本桥高岛屋大厦。因此,高岛屋出现在电子邮件页脚中。
  3. 原始电子邮件似乎是结合使用 Microsoft Outlook 和 Exchange 发送的。 HTML body 有这个头标签:<meta http-equiv="Content-Type" content="text/html; charset=iso-2022-jp"> 难以置信!
  4. Java 中的解决方法是将 MIME 内容类型从 iso-2022-jp 覆盖为 x-windows-iso2022jp。 (向 Anish B 致敬!)

来自 Oracle 的 Supported Encodings Documentation :

You have to use x-windows-iso2022jp encoding charset. It is a Variant ISO-2022-JP (MS932 based)

试试这个代码:

public class App {

    public static void main(String[] args) {
        final String z = "髙";
        final Charset charset = Charset.forName("x-windows-iso2022jp");
        final byte[] byteArr = z.getBytes(charset);
        final String z2 = new String(byteArr, charset);
        System.out.println(z);
        System.out.println(z2); 
    }

}

AdoptedOpenJDK 11 上的控制台输出: