0

Javaでソケットを使用して単純なアプリケーションを作成し、メールサーバーからヘッダーのみを読み取って行ごとに読み取ろうとしています。問題は、メールの件名の文字セット ( iso-8859-2 ) が異なる場合があり、一部の特殊文字を適切に表示できないことです。 System.out.println("ńł") を使用しているときに特殊文字を表示する適切な方法は何ですか? 「String s.get bytes」を使用する必要があることはわかっていますが、どちらにしても機能しません。特殊文字を適切に表示する可能性はありますか? 多分私は何か間違ったことをしているのかもしれませんが(私は Java が初めてです)、さまざまなコードをチェックするのにほぼ1週間費やした後、疲れてきました。サンプル テスト アプリケーションの簡単なコードを次に示します (オリジナルではありません)。

String s = "=?ISO-8859-2?Q?Zesp=F3=B3_Gmaila?=";
byte[] bytes = s.getBytes(Charset.forName("ISO-8859-2"));
String foo = new String(bytes, Charset.forName("UTF-8"));
System.out.println(foo);
//System.out.println(Charset.defaultCharset().name());

出力: =?ISO-8859-2?Q?Zesp=F3=B3_Gmaila?=

MX からの回答例:

件名: =?ISO-8859-2?Q?Gmail_jest_inny=2E_Oto=2C_co_musisz_o_nim_wiedzie=E6=2E?=

前もって感謝します

アダム

新しいコメントで完全なリストを渡すことはできません。

package javaapplication7;

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.net.QuotedPrintableCodec;

public class JavaApplication7 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)  {

    String s = "=?ISO-8859-2?Q?Zesp=F3=B3_Gmaila?=";
    Pattern p = Pattern.compile("=\\?([a-zA-Z0-9\\-]+)\\?Q\\?"); 
    Matcher m = p.matcher(s);
    if( m.find() ) {
    String encoding = m.group(1);
    String target = s.replaceAll(p.toString(),"");
    QuotedPrintableCodec qpc = new QuotedPrintableCodec(encoding);
    try {
         System.out.println(qpc.decode(target));
         } catch (DecoderException e) {
        e.printStackTrace();
     }
}
    }
}

とエラー:

run:
org.apache.commons.codec.DecoderException: Invalid quoted-printable encoding
    at      org.apache.commons.codec.net.QuotedPrintableCodec.decodeQuotedPrintable(QuotedPrintableCodec.java:189)
at org.apache.commons.codec.net.QuotedPrintableCodec.decode(QuotedPrintableCodec.java:230)
at org.apache.commons.codec.net.QuotedPrintableCodec.decode(QuotedPrintableCodec.java:279)
at org.apache.commons.codec.net.QuotedPrintableCodec.decode(QuotedPrintableCodec.java:300)
at javaapplication7.JavaApplication7.main(JavaApplication7.java:32)

BUILD SUCCESSFUL (合計時間: 1 秒)

4

3 に答える 3

0

Apache Commons CodecQuotedPrintableCodecから使用:

String s = "=?ISO-8859-2?Q?Zesp=F3=B3_Gmaila";
Pattern p = Pattern.compile("=\\?([a-zA-Z0-9\\-]+)\\?Q\\?"); //For detecting the encoding
Matcher m = p.matcher(s);
if( m.find() ) {
    String encoding = m.group(1);
    String target = s.replaceAll( p.toString(), ""); //Remove the encoding header
    QuotedPrintableCodec qpc = new QuotedPrintableCodec(encoding);
    try {
        System.out.println(qpc.decode(target));
        // prints "Zespół_Gmaila"
    } catch (DecoderException e) {
        e.printStackTrace();
    }

}
于 2013-01-06T12:41:58.737 に答える
0

おそらく、ポーランド語の文字に問題があるでしょう。私は簡単なアンサーを得ました。

String s = "=?ISO-8859-2?Q?Zesp=F3=B3_Gmaila?=";
String test=MimeUtility.decodeText(s);

System.out.println(test);

println は ,,Zespół Gmaila です。必要なライブラリは次のとおりです。

import javax.mail.internet.MimeUtility;
于 2013-09-25T10:06:33.237 に答える
0

James Server (Java のメール サーバー) のソースコードを見ることができます。答えが見つかるかもしれません。

そしてMime4J

于 2013-01-05T21:20:24.730 に答える