我尝试使用javamail lib
阅读一些电子邮件。当电子邮件包含MIME标头(Content-Type: text/plain; charset="unknown-8bit")
时,我收到此错误:java.io.UnsupportedEncodingException: unknown-8bit
任何想法为什么会发生这种情况?
答案 0 :(得分:2)
因为“unknown-8bit”不是已知的字符集名称。这在JavaMail FAQ中有解释,以及处理此问题的替代方法。我在这里复制了答案,但请注意,这可能会过时。请务必在JavaMail FAQ中搜索您可能遇到的任何其他JavaMail问题。
问:当我在包含文本数据的bodypart上调用getContent()时,为什么会出现UnsupportedEncodingException?
A:文本正文部分(即类型为“text / plain”,“text / html”或“text / xml”的正文部分)在使用getContent()时返回Unicode String对象。通常,此类正文部分在内部将其文本数据保存在某些非Unicode字符集中。 JavaMail(通过相应的DataContentHandler)尝试将该数据转换为Unicode字符串。底层JDK的字符集转换器用于执行此操作。如果JDK不支持特定的字符集,则抛出UnsupportedEncodingException。在这种情况下,您可以使用getInputStream()方法将内容检索为字节流。例如:
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尚不支持一些常用的字符集。您可以在http://www.freeutils.net/source/jcharset/的JCharset包中找到对其中一些其他字符集的支持。
您还可以为JDK已经支持的现有字符集添加别名,以便通过其他名称来识别它。您可以为“坏”字符集名称创建一个字符集提供程序,它只是重定向到现有的字符集提供程序;请参阅以下代码。创建一个适当的CharsetProvider子类,并将其与META-INF / services文件一起包含,JDK将找到它。例如,显然你可以变得更聪明,并将所有未知的字符集重定向到“us-ascii”。
==> 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