完全解決Android模擬器中文短信亂碼問題

完全解決Android模擬器中文短信亂碼問題java

給模擬器發送短信的過程:linux

DDMS/Telnet->console->Kernelandroid

發送短信致使亂碼的地方在兩個:windows

DDMS程序和consolesocket

短信亂碼問題的緣由:函數

中文短信是以ucs2編碼,存儲在pdu的usd區。google

而傳給系統的編碼非ucs2。編碼

第一步:spa

DDMS傳給console的是GBK編碼,console接收後前有底層統一轉成UTF-8編碼,至於爲何這裏就不說了!utf-8

DDMS最後是用socket與console進行交互。UI操做以命令傳給console;

默認發送時獲取字節碼的編碼是ISO-8859-1。

因此咱們作下修改:

用原來的編碼解碼而後編碼成爲GBK。經過adb發送出去。

console接收後由一個命令分發錶轉到sms_send

將字節碼從utf-8流中解析出來

這裏就出現了一個錯誤。漢字的UTF-8爲三個字節。在作第二個和第三個本身讀取前跳過了第二個。因此註釋掉

順便修改console發送時候的編碼函數

方法同上

最後的步驟是用發送者號碼和短信內容構建PDU短信;

smspdu_create_deliver_utf8-->smspdu_create_deliver-->gsm_rope_add_sms_deliver_pdu

咱們主要關注gsm_rope_add_sms_deliver_pdu就好了

在這個函數中:主要涉及到PDU編碼的知識,這個也不詳細敘述,想了解的能夠去百度;

根據代碼分析,google在用戶數據區前面多加了個長度信息。由於英文短信是從另一個分支處理的,因此不受影響!

修改方法如圖,註釋掉那段代碼!

OK,咱們流程都打通了,如今就須要編譯了。

編譯我也說一句吧,須要編譯模擬器emulator,sdk或者熟悉點的能夠只編譯ddms,而後拷貝到sdk。

好了,打完收工!你能夠用telnet鏈接模擬器:telnet localhost 5554->sms send 10086 你好!

或者在DDMS那裏發送,效果是同樣的!

 

 

涉及文件:

external\qemu\telephony\sms.c

external\qemu\android\console.c

sdk\ddms\libs\ddmlib\src\com\android\ddmlib\EmulatorConsole.java

轉載請說明出處!

發現不少博主轉載都把個人信息去掉了,太傷心了。

順便補充一句,這裏只是寫了linux的解決方案,windows須要在模擬器裏面轉碼。須要瞭解的請在這裏M我!

相關文章
相關標籤/搜索