android的message和email二處中文亂碼顯示bug解決

1.發彩信到手機短號,多媒體文件顯示不出,跟log發現是MediaModelFactory文件findPart函數找不到該文件,抓包發現數據項被修改,沒有附帶文件後綴名字,在應用塊找該文件是全部一起來找的,所以修改如下:
String[] srctemp =src.split("\\.");
part = pb.getPartByContentLocation(srctemp[0].toString());

2. 利用手機自帶郵箱發文附件,部分郵箱顯示亂碼

在Rfc822Output文件writeOneAttachment函數將文件名字編碼增強下,加+2是因爲還有": "這二字符也要佔位置.
writeHeader(writer, "Content-Type", attachment.mMimeType + ";\n name="" + MimeUtility.foldAndEncode2(attachment.mFileName,"Content-Type".length() + 2) + """);

writeHeader(writer, "Content-Disposition",  "attachment;"  + "\n filename="" + MimeUtility.foldAndEncode2(attachment.mFileName,"Content-Disposition".length() + 2) + "";" 
                    + "\n size=" + Long.toString(attachment.mSize));

 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的轉碼,亂碼也就不再出現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章