javamail中MimeUtility解码繁体字的问题

Keyword: javamail MimeUtility 繁体字 乱码

在描述这个问题之前,先把一些包的包名,版本,用到的方法,以及大概情况贴上来,大家可以先对号入座再考虑往下看

包名:javax.mail.jar
版本:version 1.4 : 48.0, super bit
所涉及的类: javax.mail.internet.MimeUtility
类方法:javax.mail.internet.MimeUtility.decodeText(String arg0) / javax.mail.internet.MimeUtility.decodeWord(String arg0)

问题

很多人在使用javamail解析邮件主题,正文,或者附件名称的时候经常会遇到这样的问题,比如你肉眼看到的是繁体字,而解析出来的却是一个菱形的异常字符,比如��,而这种问题出现的根本问题大多数是因为MimeUtility没办法直接解码gb2312/GB2312编码的繁体字字符

不管是邮件主题,附件名还是正文,所有内容的编码都遵循以下格式:

=?gb2312?B?1/e3qCA=?=
  • 第一个“=?”与“?”之间代表此字符串的编码
  • 第二个“?”与"?"之间的B代表base64,如果是Q则代表 Quoted-Printable
  • 第三个"?"与最后的“=?”之间的内容就是由前面指定的编码再由后续的转化而成的内容,例如上面是由gb2312编码转化成的字符串然后再由base64转化后的内容,包括邮件主题,附件名字以及正文,具体编码后的字符串可以查看邮件的header信息,里边包括了邮件的每个part的编码后的内容

但是问题来了,javamail中的MimeUtility.decodeText或者MimeUtility.decodeWord没办法直接解码经过gb2312编码的繁体字,首先我们来分析一下,GB2312和GBK的区别:

GB2312是一个简体中文字符集
GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准

很明显,意思就是说GB2312是GBK字符集的子集,所以假想一下,如果经过GB2312编码的简繁体字,是否可以使用GBK的编码方式解码,并且MimeUtility.decodeText/MimeUtility.decodeWord支持使用gbk解码,经过试验,证明是可以的,而且很简单,先将gb2312这个编码替换成gbk,也就是将=?和?中间的gb2312这一串替换掉,变成如下

=?gbk?B?1/e3qCA=?=

然后再使用MimeUtility.decodeText或者MimeUtility.decodeWord解码字符串,以解码经过gb2312编码的繁体中文邮件主题为例,完整代码如下:

String headerSubject = message.getHeader("subject")[0];
//此时headerSubject就类似上面的字符串=?gb2312?B?1/e3qCA=?=
headerSubject = headerSubject.replaceAll("gb2312", "gbk").replaceAll("GB2312", "gbk");
//替换gb2312/GB2312编码为gbk,然后直接用MimeUtility.decodeText解码字符串,就可以正确解码繁体字了
headerSubject = MimeUtility.decodeText(headerSubject);

——END——
作者 : Eason,专注各种技术、平台、集成,不满现状,喜欢改改改
文章、技术合作
Email : [email protected]

你可能感兴趣的:(javamail中MimeUtility解码繁体字的问题)