首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >javamail抛出java.io.UnsupportedEncodingException:未知-8位

javamail抛出java.io.UnsupportedEncodingException:未知-8位
EN

Stack Overflow用户
提问于 2017-11-29 18:11:35
回答 1查看 1.6K关注 0票数 0

我试着用javamail lib阅读一些电子邮件。当电子邮件包含MIME头(Content-Type: text/plain; charset="unknown-8bit")时,我得到以下错误:java.io.UnsupportedEncodingException: unknown-8bit

知道为什么会发生这种事吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-29 20:33:30

因为“未知-8位”不是已知的字符集名称。在JavaMail常见问题中解释了这一点,并给出了处理此问题的备选方案。我在这里复制了答案,但请注意,这可能会过时。请务必在JavaMail常见问题解答中查找您可能遇到的任何其他JavaMail问题。

Q:,当我在包含文本数据的主体部件上调用getContent()时,为什么要获得UnsupportedEncodingException?

A:当使用getContent()时,文本正文部件(即类型为“text/平原”、"text/html“或"text/xml")的主体返回getContent字符串对象。通常,这些主体部件在内部将它们的文本数据保存在一些非Unicode字符集中。JavaMail (通过相应的DataContentHandler)尝试将数据转换为Unicode字符串。底层JDK的字符集转换器就是用来实现这一点的。如果JDK不支持特定的字符集,则抛出UnsupportedEncodingException。在本例中,您可以使用getInputStream()方法以字节流的形式检索内容。例如:

代码语言:javascript
复制
String s;
if (part.isMimeType("text/plain")) {
    try {
        s = part.getContent();
    } catch (UnsupportedEncodingException uex) {
        InputStream is = part.getInputStream();
        /*
         * Read the input stream into a byte array.
         * Choose a charset in some heuristic manner, use
         * that charset in the java.lang.String constructor
         * to convert the byte array into a String.
         */
         s = convert_to_string(is);
    } catch (Exception ex) {
        // Handle other exceptions appropriately
    }
}

有些常用的字符集是JDK还不支持的。您可以在JCharset包http://www.freeutils.net/source/jcharset/中找到对这些额外字符集的支持。

您还可以为JDK已经支持的现有字符集添加一个别名,以便通过一个额外的名称来知道它。您可以为“坏”字符集名称创建一个字符集提供程序,它只需重定向到现有的字符集提供程序;请参阅下面的代码。创建一个适当的CharsetProvider子类,并将其与META/services文件一起包含进来,JDK就会找到它。显然,您可以变得更聪明,并将所有未知字符重定向到“us”,例如。

代码语言:javascript
复制
==> UnknownCharsetProvider.java <==
import java.nio.charset.*;
import java.nio.charset.spi.*;
import java.util.*;

public class UnknownCharsetProvider extends CharsetProvider {
     private static final String badCharset = "x-unknown";
     private static final String goodCharset = "iso-8859-1";

     public Charset charsetForName(String charset) {
         if (charset.equalsIgnoreCase(badCharset))
             return Charset.forName(goodCharset);
         return null;
     }

     public Iterator<Charset> charsets() {
         return Collections.emptyIterator();
     }
}

==> META-INF/services/java.nio.charset.spi.CharsetProvider <==
UnknownCharsetProvider
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47559169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档