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 : eason.lau02@hotmail.com