欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

彻底解决Android模拟器中文短信乱码问题

彻底解决Android模拟器中文短信乱码问题

给模拟器发送短信的过程:
DDMS/Telnet->console->Kernel
发送短信导致乱码的地方在两个:
DDMS程序和console
短信乱码问题的原因:
中文短信是以ucs2编码,存储在pdu的usd区。
而传给系统的编码非ucs2。
第一步:
DDMS传给console的是GBK编码,console接收后前有底层统一转成UTF-8编码,至于为什么这里就不说了!
DDMS最后是用socket与console进行交互。UI操作以命令传给console;
[图片:1354089597_4667.png]screen.width*0.6) {this.width=screen.width*0.6;this.alt='';this.onmouseover=this.style.cursor='pointer';this.onclick=function(){window.open('http://img.my.csdn.net/uploads/201211/28/1354089597_4667.png')}}" />
默认发送时获取字节码的编码是ISO-8859-1。
所以我们做下修改:
[图片:1354089660_8311.png]screen.width*0.6) {this.width=screen.width*0.6;this.alt='';this.onmouseover=this.style.cursor='pointer';this.onclick=function(){window.open('http://img.my.csdn.net/uploads/201211/28/1354089660_8311.png')}}" />
console接收后由一个命令分发表转到sms_send
[图片:1354089766_3943.png]screen.width*0.6) {this.width=screen.width*0.6;this.alt='';this.onmouseover=this.style.cursor='pointer';this.onclick=function(){window.open('http://img.my.csdn.net/uploads/201211/28/1354089766_3943.png')}}" />
将字节码从utf-8流中解析出来
[图片:1354089945_3926.png]screen.width*0.6) {this.width=screen.width*0.6;this.alt='';this.onmouseover=this.style.cursor='pointer';this.onclick=function(){window.open('http://img.my.csdn.net/uploads/201211/28/1354089945_3926.png')}}" />
这里就出现了一个错误。汉字的UTF-8为三个字节。在做第二个和第三个自己读取前跳过了第二个。所以注释掉
[图片:1354090108_7974.png]screen.width*0.6) {this.width=screen.width*0.6;this.alt='';this.onmouseover=this.style.cursor='pointer';this.onclick=function(){window.open('http://img.my.csdn.net/uploads/201211/28/1354090108_7974.png')}}" />
顺便修改console发送时候的编码函数
方法同上
最后的步骤是用发送者号码和短信内容构建PDU短信;
smspdu_create_deliver_utf8-->smspdu_create_deliver-->gsm_rope_add_sms_deliver_pdu
我们主要关注gsm_rope_add_sms_deliver_pdu就行了
在这个函数中:主要涉及到PDU编码的知识,这个也不详细叙述,想了解的可以去百度;
根据代码分析,google在用户数据区前面多加了个长度信息。因为英文短信是从另外一个分支处理的,所以不受影响!
[图片:1354090599_1420.png]screen.width*0.6) {this.width=screen.width*0.6;this.alt='';this.onmouseover=this.style.cursor='pointer';this.onclick=function(){window.open('http://img.my.csdn.net/uploads/201211/28/1354090599_1420.png')}}" />
修改方法如图,注释掉那段代码!
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
本文,是本人原创。转载请说明出处!
不好意思,可能图片挂了。大家可以看http://blog.csdn.net/tomhour/article/details/8234855

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功