java.io.UnsupportedEncodingException:cp932?

java.io.UnsupportedEncodingException:cp932?,java,encoding,character-encoding,mime-types,openjdk,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.c

什么类型的内容会导致此异常

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)
原因:java.io.UnsupportedEncodingException:cp932
位于sun.nio.cs.StreamDecoder.forInputStreamReader(StreamDecoder.java:71)
在java.io.InputStreamReader。(InputStreamReader.java:100)
在com.google.code.com.sun.mail.handlers.text\u plain.getContent(text\u plain.java:109)
位于com.google.code.javax.activation.DataSourceDataContentHandler.getContent(DataHandler.java:803)
在com.google.code.javax.activation.DataHandler.getContent(DataHandler.java:550)上
位于com.google.code.javax.mail.internet.MimeBodyPart.getContent(MimeBodyPart.java:639)

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

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

据介绍,CP932是Shift JIS的扩展。。。这是用于表示日语文本的字符集之一


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

OpenJDK也可能(尽管我不太可能)不承认“cp932”是它所指的“MS932”和“windows-31j”的别名


我查过了

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

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

  • “MS932”
  • “windows-932”
  • “CS31J”
如果将“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代码用于查找编码的私有数据结构中。(警告:这可能会使您的应用程序变得脆弱,并导致可移植性问题。)
  • 针对请求为字符编码添加别名的简单方法的JavaSE提出RFE。(这是一个真正的长期解决方案,尽管您可以通过编写建议的增强并将其作为补丁提交给OpenJDK团队来加速它。)