【问题标题】:MimeUtility.decode() doesn't work for every encoded textMimeUtility.decode() 不适用于每个编码文本
【发布时间】:2014-05-27 11:41:49
【问题描述】:

我正在开发一个邮件应用程序,但在解码 mime 编码文本时遇到了一些麻烦。我正在使用 MimeUtility.decode() 但它不适用于每个编码文本。有些文本可以正确解码,但有些则不能。

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

我该如何解决这个问题??

这是我用来解码的代码

MimeUtility.decodeText(text);

这些是失败文本的示例:

【问题讨论】:

  • 向我们展示您的代码和失败的文本。
  • 我添加到第一条消息
  • 我们能猜到问题实际上是RFC2047编码并且成功的字符串不是这样编码的吗?
  • 你为什么使用图片?请改为复制/粘贴文本。这两个不同的例子是同一个标题的一部分吗?
  • 实际上第二张图片中的字符串是非标准的。 ule=20 应该是 ule_ 并且结束分隔符 ?= 应该与空格相邻(所以可能是 ule_Eser?= 而不是 ule=20?=Eser)。

标签: java encoding utf-8 mime decoding


【解决方案1】:

****解决方案*****(感谢@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;

}

【讨论】:

    【解决方案2】:

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

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

    先将 ISO-8859-1 文本转换成 bye 数组,然后再转换成字符串

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

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

    【讨论】:

    • 请务必包含文本版本,以便我可以尝试
    • 我认为您正在处理整个文本,您只需要处理图像中的部分文本
    • 你的方法行得通,但有什么快速的方法可以从整个文本中获取编码部分吗?
    【解决方案3】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-03
      相关资源
      最近更新 更多