javamail中MimeUtility解碼繁體字的問(wèn)題

Keyword: javamail MimeUtility 繁體字 亂碼

在描述這個(gè)問(wèn)題之前,先把一些包的包名,版本,用到的方法,以及大概情況貼上來(lái),大家可以先對(duì)號(hào)入座再考慮往下看

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

問(wèn)題

很多人在使用javamail解析郵件主題,正文,或者附件名稱(chēng)的時(shí)候經(jīng)常會(huì)遇到這樣的問(wèn)題,比如你肉眼看到的是繁體字,而解析出來(lái)的卻是一個(gè)菱形的異常字符,比如??,而這種問(wèn)題出現(xiàn)的根本問(wèn)題大多數(shù)是因?yàn)镸imeUtility沒(méi)辦法直接解碼gb2312/GB2312編碼的繁體字字符

不管是郵件主題,附件名還是正文,所有內(nèi)容的編碼都遵循以下格式:

=?gb2312?B?1/e3qCA=?=
  • 第一個(gè)“=?”與“?”之間代表此字符串的編碼
  • 第二個(gè)“?”與"?"之間的B代表base64,如果是Q則代表 Quoted-Printable
  • 第三個(gè)"?"與最后的“=?”之間的內(nèi)容就是由前面指定的編碼再由后續(xù)的轉(zhuǎn)化而成的內(nèi)容,例如上面是由gb2312編碼轉(zhuǎn)化成的字符串然后再由base64轉(zhuǎn)化后的內(nèi)容,包括郵件主題,附件名字以及正文,具體編碼后的字符串可以查看郵件的header信息,里邊包括了郵件的每個(gè)part的編碼后的內(nèi)容

但是問(wèn)題來(lái)了,javamail中的MimeUtility.decodeText或者M(jìn)imeUtility.decodeWord沒(méi)辦法直接解碼經(jīng)過(guò)gb2312編碼的繁體字,首先我們來(lái)分析一下,GB2312和GBK的區(qū)別:

GB2312是一個(gè)簡(jiǎn)體中文字符集
GBK是在國(guó)家標(biāo)準(zhǔn)GB2312基礎(chǔ)上擴(kuò)容后兼容GB2312的標(biāo)準(zhǔn)

很明顯,意思就是說(shuō)GB2312是GBK字符集的子集,所以假想一下,如果經(jīng)過(guò)GB2312編碼的簡(jiǎn)繁體字,是否可以使用GBK的編碼方式解碼,并且MimeUtility.decodeText/MimeUtility.decodeWord支持使用gbk解碼,經(jīng)過(guò)試驗(yàn),證明是可以的,而且很簡(jiǎn)單,先將gb2312這個(gè)編碼替換成gbk,也就是將=?和?中間的gb2312這一串替換掉,變成如下

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

然后再使用MimeUtility.decodeText或者M(jìn)imeUtility.decodeWord解碼字符串,以解碼經(jīng)過(guò)gb2312編碼的繁體中文郵件主題為例,完整代碼如下:

String headerSubject = message.getHeader("subject")[0];
//此時(shí)headerSubject就類(lèi)似上面的字符串=?gb2312?B?1/e3qCA=?=
headerSubject = headerSubject.replaceAll("gb2312", "gbk").replaceAll("GB2312", "gbk");
//替換gb2312/GB2312編碼為gbk,然后直接用MimeUtility.decodeText解碼字符串,就可以正確解碼繁體字了
headerSubject = MimeUtility.decodeText(headerSubject);

——END——
作者 : Eason,專(zhuān)注各種技術(shù)、平臺(tái)、集成,不滿(mǎn)現(xiàn)狀,喜歡改改改
文章、技術(shù)合作
Email : eason.lau02@hotmail.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容