MimeUtility.decode()不适用于每个编码文本

时间:2014-04-13 15:14:24

标签: java encoding utf-8 mime decoding

我正在使用邮件应用程序,我在解码mime编码文本方面遇到了一些麻烦。我正在使用MimeUtility.decode()但它不适用于每个编码文本。有些文本被正确解码,但有些文本没有。

这些无法解码的编码文本特别具有utf-8和iso-8859-9编码类型。

我如何解决这个问题??

这是我用于解码的代码

MimeUtility.decodeText(text);

这些是失败文字的示例:

Failing Text 1

Failing Text 2

3 个答案:

答案 0 :(得分:7)

****解决方案***** (感谢@ user_xtech007)

我通过使用正则表达式分割多个编码部分来解码编码部分的问题。

以下是我使用

的方法的代码
private final String ENCODED_PART_REGEX_PATTERN="=\\?([^?]+)\\?([^?]+)\\?([^?]+)\\?=";

private String decode(String s)
{
    Pattern pattern=Pattern.compile(ENCODED_PART_REGEX_PATTERN);

    Matcher m=pattern.matcher(s);

    ArrayList<String> encodedParts=new ArrayList<String>();

    while(m.find())
    {
        encodedParts.add(m.group(0));

    }

    if(encodedParts.size()>0)
    {
        try
        {
            for(String encoded:encodedParts)
            {
                s=s.replace(encoded, MimeUtility.decodeText(encoded));
            }

            return s;

        } catch(Exception ex)
        {
            return s;
        }
    }
    else
        return s;

}

答案 1 :(得分:3)

将您收到的字符串转换为字节数组,然后使用它来解码utf-8文本

 String s2 = new String(bytes, "UTF-8");

首先将ISO-8859-1文本转换为再见数组,然后将其转换为字符串

 byte[] b2 = s.getBytes("ISO-8859-1");  

要从uri获取编码字符串,可以使用Regex

答案 2 :(得分:2)

您也可以通过输入

来解码此字符串
System.setProperty("mail.mime.decodetext.strict", "false");

使用MimeUtility.decodeText(text);

之前

这将确保“内部词”也被解码:

  

mail.mime.decodetext.strict 属性控制MIME的解码   编码的单词。 MIME规范要求编码的单词从   一个空格分隔的单词的开头。一些邮件错误   在单词的中间包括编码的单词。如果   mail.mime.decodetext.strict系统属性设置为“false”,an   将尝试解码这些非法编码的单词。该   默认为真。

https://docs.oracle.com/javaee/7/api/javax/mail/internet/MimeUtility.html