使用套接字读取行使用不同的charset-iso-8859-2形成mx

时间:2013-01-05 21:16:10

标签: java email character-encoding

我正在尝试使用Java中的套接字编写简单的应用程序,以便只读取邮件服务器中逐行读取的标头。 问题是,有时邮件主题有不同的字符集(iso-8859-2),我无法正确显示一些特殊字符。使用System.out.println(“ñł”)时显示特殊字符的正确方法是什么? 我知道我必须使用“String s.get bytes”,但无论哪种方式都不起作用。是否有可能正确显示特殊字符。也许我做错了什么(我是java的新手)但是花了差不多一个星期检查出不同的代码我已经累了。 这是来自示例测试应用程序(非原始)的简单代码:

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?=

提前谢谢

亚当

我无法在新评论中过去完整列表,所以这里有Esailija帮助的所有内容:

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)

建立成功(总时间:1秒)

3 个答案:

答案 0 :(得分:0)

你可以看到James Server的源代码(是Java中的邮件服务器),你可以找到答案:

和Mime4J

答案 1 :(得分:0)

使用Apache Commons Codec中的QuotedPrintableCodec

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();
    }

}

答案 2 :(得分:0)

你可能有抛光字符的问题。我得到了简单的anwser。

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;