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


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

    给模拟器发送短信的过程:

    DDMS/Telnet->console->Kernel

    发送短信导致乱码的地方在两个:

    DDMS程序和console

    短信乱码问题的原因:

    中文短信是以ucs2编码,存储在pdu的usd区。

    而传给系统的编码非ucs2。

    第一步:

    DDMS传给console的是GBK编码,console接收后前有底层统一转成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那里发送,效果是一样的!

    涉及文件:

    externalqemu elephonysms.c

    externalqemuandroidconsole.c

    sdkddmslibsddmlibsrccomandroidddmlibEmulatorConsole.java

    转载请说明出处!

    发现很多博主转载都把我的信息去掉了,太伤心了。

    顺便补充一句,这里只是写了linux的解决方案,windows需要在模拟器里面转码。需要了解的请在这里M我!

  • 相关阅读:
    thinkphp中ajax使用实例(thinkphp内置支持ajax)
    Uncaught SyntaxError: Invalid regular expression flags(看页面源代码)
    php函数实现显示几秒前,几分钟前,几天前等方法(网络上什么都有)
    php实现二叉树遍历
    php实现数组中的逆序对(归并排序实现:排序 辅助数组)
    基于HTML5气3D仿真培训系统
    CSDN Androidclient生产 导航帖
    MongoDB日常保养
    Machine Learning—Linear Regression
    OpenCVR 有新成员 OpenCVV OpenCVC
  • 原文地址:https://www.cnblogs.com/rexonor/p/3195596.html
Copyright © 2020-2023  润新知