【问题标题】:Reading line using sockets form mx with different charset- iso-8859-2使用具有不同 charset-iso-8859-2 的 mx 格式的套接字读取行
【发布时间】:2025-12-28 20:40:06
【问题描述】:

我正在尝试使用 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 秒)

【问题讨论】:

  • 您如何阅读标准输出,因为这会影响您看到的内容

标签: java email character-encoding


【解决方案1】:

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

还有 Mime4J

【讨论】:

    【解决方案2】:

    使用来自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();
        }
    
    }
    

    【讨论】:

    • 感谢大家的快速回答。我已经下载了 org.apache.commons.codec.jar 并将其添加到导入,但编译后我收到以下错误:(import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons .codec.DecoderException; 导入 o​​rg.apache.commons.codec.net.QuotedPrintableCodec; )"org.apache.commons.codec.DecoderException: org.apache.commons.codec.net.QuotedPrintableCodec.decodeQuotedPrintable 处的引用打印编码无效( QuotedPrintableCodec.java:189)”。有什么线索吗?谢谢
    • 我已经编辑了主要问题,因为无法在评论中超越所有内容。感谢您的帮助
    • @admfotad 您需要从末尾删除=?
    • 非常感谢 - 你为我节省了很多时间。完美运行。
    【解决方案3】:

    您可能对波兰语字符有问题。我得到了简单的答案。

    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;
    

    【讨论】: