Android的郵件編碼網上的資料很少,但大體與JavaMail相似,在參考了網上關於JavaMail的資料,經過多次嘗試,最終解決附件中文名亂碼問題。
郵件附件名的編碼與郵件名的編碼可以如出一轍。因爲多功能Internet郵件擴充服務協議,即MIME(Multipurpose Internet Mail Extensions)對附件名的規定是US-ASCII(應該也是ASCII),因此該亂碼bug的出現與Java和Android無關,是MIME的不規範。
郵件的標題,用了一種更簡短的格式來標註“字符編碼”和“傳輸編碼”。比如,標題內容爲 "中",則在郵件源代碼中表示爲: " =?GB2312?B?1tA=?= ",其中第一個
“=?”與“?”中間的部分指定了字符編碼,在這個例子中指定的是 GB2312。“?”與“?”中間
的“B”代表 Base64。如果是“Q”則代表 Quoted-Printable。最後“?”與“?=”之間的部分,就是經過 GB2312 轉化成字節串,再經過Base64 轉化後的標題內容。如果“傳輸編碼”改爲 Quoted-Printable,同樣,如果標題內容爲 "中":"=?GB2312?Q?=D6=D0?= " 。
根據上面解釋,那麼解決這個bug已經沒有問題了。在我們找到讀取附件名的地方,如mFileName,位於Email/provider/EmailContent.java,首先對其進行base64Encode編
碼:String name = com.android.email.Utility.base64Encode(mFileName), 然後強制給name添加編碼頭和尾:String name2 = "=?utf8?B?" + name + "?="。這樣接受郵件的客戶端在檢測到"=?utf8?B?"的時候,會對字符串進行base64和utf-8的轉碼,亂碼也就不再出現。