java.io.UnsupportedEncodingException:cp932?

时间:2013-08-15 02:10:03

标签: java encoding character-encoding mime-types openjdk

哪种类型的内容会导致此异常?

Caused by: java.io.UnsupportedEncodingException: cp932
        at sun.nio.cs.StreamDecoder.forInputStreamReader(StreamDecoder.java:71)
        at java.io.InputStreamReader.<init>(InputStreamReader.java:100)
        at com.google.code.com.sun.mail.handlers.text_plain.getContent(text_plain.java:109)
        at com.google.code.javax.activation.DataSourceDataContentHandler.getContent(DataHandler.java:803)
        at com.google.code.javax.activation.DataHandler.getContent(DataHandler.java:550)
        at com.google.code.javax.mail.internet.MimeBodyPart.getContent(MimeBodyPart.java:639)

为什么OpenJDK不能处理这种编码?

1 个答案:

答案 0 :(得分:7)

使用该字符集/编码的任何文本或基于文本的内容!

根据Wikipedia,CP932是Shift JIS ...的扩展名,它是用于表示日文文本的字符集之一。


根据this page,CP932位于“扩展编码集(包含在lib / charsets.jar中)”中。如果它不在您的OpenJDK安装中,请查找yum / apt /任何提供额外Java字符集支持的OpenJDK包。在OpenJDK 中支持CP932 绝对可以在某处...

也有可能(尽管IMO不太可能)OpenJDK不会将“cp932”识别为它所指的“MS932”和“windows-31j”的别名。


我查了the code

问题是Java(不仅仅是OpenJDK!)根本不识别“cp932”别名。它无法识别的原因是别名非标准

此编码的官方(IANA认可)名称为“windows-31j”,默认情况下Java还支持以下别名:

  • “MS932”
  • “窗口-932”
  • 法 “csWindows31J”

如果将“sun.nio.cs.map”系统属性(即使用“-D ...”)设置为“Windows-31J / Shift_JIS”,那么Java也会识别“shift-jis”,“ ms_kanji“,”x-sjis“和”csShiftJIS“等效......但这只应用于与旧的(1.4.0及更早版本)JDK的向后兼容性,这些JDK没有正确实现真正的SHIFT-JIS编码。 (此外,这不能解决您的问题...)

那你能做什么?

  • 拒绝/弃置内容为无效。 (它是。)
  • 找出此内容的来源,并获取他们以修复错误的编码名称。
  • 尝试使用之前拦截Google代码中的编码名称,并将非标准名称替换为相应的标准名称。
  • 使用讨厌的反射hackery为Oracle代码用于查找编码的私有数据结构添加编码别名。 (警告:这可能会使您的应用程序变得脆弱,并导致可移植性问题。)
  • 针对Java SE提出RFE,请求为字符编码添加别名的简便方法。 (这是一个非常长期的解决方案,尽管您可以通过编写并将建议的增强功能作为补丁提交给OpenJDK团队来加速它。)