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

问题描述 投票:1回答:3

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

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

我怎么能解决这个问题?

这是我用于解码的代码

MimeUtility.decodeText(text);

这些是失败文本的示例:

java encoding utf-8 mime decoding
3个回答
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;

}

3
投票

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

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

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

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

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


2
投票

你也可以通过put来解码这个字符串

System.setProperty("mail.mime.decodetext.strict", "false");

在你使用MimeUtility.decodeText(text);之前

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.