Keyword: javamail
MimeUtility
繁體字
亂碼
在描述這個(gè)問(wèn)題之前喝检,先把一些包的包名铁追,版本,用到的方法插龄,以及大概情況貼上來(lái),大家可以先對(duì)號(hào)入座再考慮往下看
包名: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)
問(wèn)題
很多人在使用javamail解析郵件主題科展,正文均牢,或者附件名稱的時(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就類似上面的字符串=?gb2312?B?1/e3qCA=?=
headerSubject = headerSubject.replaceAll("gb2312", "gbk").replaceAll("GB2312", "gbk");
//替換gb2312/GB2312編碼為gbk,然后直接用MimeUtility.decodeText解碼字符串马篮,就可以正確解碼繁體字了
headerSubject = MimeUtility.decodeText(headerSubject);
——END——
作者 : Eason
沾乘,專注各種技術(shù)、平臺(tái)浑测、集成意鲸,不滿現(xiàn)狀,喜歡改改改
文章尽爆、技術(shù)合作
Email : eason.lau02@hotmail.com