"unknown-8bit"は既知の文字セット名ではないためです。これは、JavaMail FAQで説明されています。私はここで答えをコピーしましたが、これは時代遅れになるかもしれないことに注意してください。その他のJavaMailの問題については、JavaMail FAQを検索してください。
Q:テキストデータを含むボディ部でgetContent()を呼び出すと、なぜUnsupportedEncodingExceptionが発生しますか?
A:テキストのボディ部(タイプ "text/plainの"、 "text/htmlの"、または "text/xmlで"、すなわち、ボディ部)のgetContent()を使用した場合のUnicode文字列オブジェクトを返します。通常、そのような本体は、内部的にテキストデータをUnicode以外の文字セットで保持します。 JavaMail(対応するDataContentHandler経由)は、そのデータをUnicode文字列に変換しようとします。基になるJDKのcharsetコンバーターを使用してこれを行います。 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がまだサポートしていないいくつかの文字セットがあります。これらの追加の文字セットの一部は、JCharsetパッケージのhttp://www.freeutils.net/source/jcharset/でサポートされています。
すでにJDKでサポートされている既存のcharsetのエイリアスを追加して、追加の名前で知ることもできます。既存の文字セットプロバイダに単にリダイレクトする「悪い」文字セット名用の文字セットプロバイダを作成できます。次のコードを参照してください。適切な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
これは実際のエンコードではないためですか? – SLaks