无法使用字符集 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 进行调试。我还定期处理日语文本,所以我知道我的字体设置正常。
更新
感谢您的宝贵意见。
- 我没注意到这个汉字是更常见的高 (U+9AD8) 的“变体”。我的字体太小了,没注意到。
- 客户办公地址为东京日本桥高岛屋大厦。因此,高岛屋出现在电子邮件页脚中。
- 原始电子邮件似乎是结合使用 Microsoft Outlook 和 Exchange 发送的。 HTML body 有这个头标签:
<meta http-equiv="Content-Type" content="text/html; charset=iso-2022-jp">
难以置信!
- 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 上的控制台输出:
我正在处理用日语写的客户电子邮件。有些 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 进行调试。我还定期处理日语文本,所以我知道我的字体设置正常。
更新
感谢您的宝贵意见。
- 我没注意到这个汉字是更常见的高 (U+9AD8) 的“变体”。我的字体太小了,没注意到。
- 客户办公地址为东京日本桥高岛屋大厦。因此,高岛屋出现在电子邮件页脚中。
- 原始电子邮件似乎是结合使用 Microsoft Outlook 和 Exchange 发送的。 HTML body 有这个头标签:
<meta http-equiv="Content-Type" content="text/html; charset=iso-2022-jp">
难以置信! - 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 上的控制台输出: