V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lqzhgood
V2EX  ›  程序员

短信里面的 中(utf16-be) 英(ASCII) 混合 Buffer 如何解码?

  •  
  •   lqzhgood · 2020-11-20 17:33:34 +08:00 · 1546 次点击
    这是一个创建于 1468 天前的主题,其中的信息可能已经有所发展或是发生改变。

    清理电脑发现了以前 Symbian S60v3 的短信备份,想解析出来看看。

    第一步解析短信内容就遇到问题了。

    https://www.zhihu.com/question/264240744/answer/279128285
    

    由于短信内 中文 编码是 utf16-be(两位),英文编码是 ASCII(一位) 。那么我应该如何解析中英文混合的内容呢~ 并没有标志位告诉我当前字符是 中文 还是 英文 ,所以我应该如何判断采用哪种编码来解析呢?

    const 我是用例 = [0x62, 0x11, 0x67, 0x0, 0x4e, 0xb2, 0x72, 0x31, 0x76, 0x84, 0x67, 0xb, 0x53, 0xcb, 0x4e, 0xec, 0xe0, 0x20, 0x3a, 0x29, 0x20, 0x20, 0x4d, 0x65, 0x72, 0x72, 0x79,
        0x20, 0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x6d, 0x61, 0x73, 0x7e, 0x7e, 0x7e, 0x7e, 0x21, 0x21, 0x21]
    // 上面的短信内容 #大致# 是  [我最亲爱的朋友们 **** :)  Merry Christmas~~~~!!!]    *** 为未知字符
    

    参考文章

    S60v3 短信解析

    https://books.google.com/books?id=7PO5BQAAQBAJ&pg=PA245&lpg=PA245&dq=1000484B%5CMail2+encoded&source=bl&ots=tZTcJej9Gt&sig=ACfU3U2XuBvQcfCncxEFynrPWfKP3A3ozw&hl=zh-CN&sa=X&ved=2ahUKEwiR7ZzHiZDtAhURc3AKHVT5AIkQ6AEwCXoECAEQAg#v=onepage&q=1000484B%5CMail2%20encoded&f=false
    

    源文件 Buffer

    https://note.ms/s60sms

    P.s 文章看得有点吃力, 245 页的动态 length 解析的那 4 个步骤啥意思? 一直无法复现…… 求教

    10 条回复    2020-11-21 17:35:44 +08:00
    cjd6568358
        1
    cjd6568358  
       2020-11-20 18:06:33 +08:00
    ascii 都是单字节字母 可以先把 buffer 都用 ascii 解一遍看看出来了啥 剩下的乱码再用 utf16 试试
    cjd6568358
        2
    cjd6568358  
       2020-11-20 18:08:31 +08:00
    另外短信不是一般都是 Unicode 编码么 怎么还能混着编?
    Bromine0x23
        3
    Bromine0x23  
       2020-11-20 18:33:19 +08:00
    length = length0 % 2 == 0 ? length0 / 2 : length0 / 4 + length1 * 64
    应该是这样
    Bromine0x23
        4
    Bromine0x23  
       2020-11-20 18:39:16 +08:00
    0xe0,0x20 可能是某种编码变更提示
    venster
        5
    venster  
       2020-11-20 18:46:02 +08:00 via iPhone
    我记得黑莓那会需要改编码为 ucs2 才能显示汉字。或许有帮助。
    lululau
        6
    lululau  
       2020-11-20 20:58:19 +08:00 via iPhone
    不可能
    lululau
        7
    lululau  
       2020-11-20 20:58:35 +08:00 via iPhone
    这是个逻辑问题,不是技术问题
    lxilu
        8
    lxilu  
       2020-11-21 14:36:31 +08:00
    我确认 E020 为标记,E000-F8FF 是 Private Use Area
    lxilu
        9
    lxilu  
       2020-11-21 14:53:18 +08:00
    有短信中心号码(收信号所在地)和发信号,注意一下
    lqzhgood
        10
    lqzhgood  
    OP
       2020-11-21 17:35:44 +08:00
    @cjd6568358 估计为了节省空间吧,因为 ascii 的 Unicode 高位都是 0,估计为了空间裁掉了。
    事实上确实短信可以发英文 140 字。那么英文肯定不是 Unicode 编码的,应该是单字节 ascii 。
    中文至少双字节,那么可以肯定是混编无疑。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3401 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 00:41 · PVG 08:41 · LAX 16:41 · JFK 19:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.