2017-11-29 19 views
0

javamail libを使用して読み取ろうとしている電子メールがありました。電子メールにMIMEヘッダー(Content-Type: text/plain; charset="unknown-8bit")が含まれている場合、このエラーが発生します。java.io.UnsupportedEncodingException: unknown-8bitjavamailがjava.io.UnsupportedEncodingExceptionをスローする:unknown-8bit

なぜこのようなことが起こりますか?

+0

これは実際のエンコードではないためですか? – SLaks

答えて

1

"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 
関連する問題