`
hyshucom
  • 浏览: 808388 次
文章分类
社区版块
存档分类
最新评论

MC703 3G模块联系人名称编解码问题

 
阅读更多

在使用华为的MC703 3G模块进行联系人功能测试的时候,发现中英文混合的名称处理上与短信的编码类型不一样。


英文的联系人名称是直接就可以从模块中读取处理的,读出来就是ASCII字符,不需要进行其他操作。

然而,中英文混合或只有中文的联系人名称处理就比较麻烦了。其格式在华为的技术文档上并没有说明。这个玩意浪费了俺比较多时间,最终还是搞出来了,目前测试没有发现神马问题。


写入中文或中英文名称的联系人,需要对联系人名称进行编码,这个时候都是编码成80(从读取出来了解到的编码格式)的编码,然后在编码后的字符串前面加上80,新建联系就OK。

如:

at^cpbw=,"9999888877",129,"806D4B8BD50034",1

9999888877: 联系人电话号码

129: 号码类型

806D4B8BD50034: 联系人名称(这里表示“测试4”)。80俺理解为中英文混合编码类型(实际上就是UNICODE编码),之后每4为代表一个中文字或英文字符

1:表示联系人名称为非纯英文字符


通过研究发现,联系人名称的编码有80、81、82三种类型,写入的时候只能是80类型,读取出来的可以是这三种类型。

当读取出来的是80类型编码的联系人名称时,直接按照UNICODE进行解码就OK。

但是遇到81、82类型的时候,就有点麻烦了。81、82类型都是联系人名称中只能含有一个中文字符,英文字符个数不考虑。遇到这两种情况都需要考虑是只有一个中文字;还是一个中文字,前面或后面或前后有一个或多个英文字符的情况。


下面说81编码的解析:

李: 编码为8101CECE(该编码是从模块读取出来的)。81是编码类型,01是长度,CECE是中文编码(该编码需要通过移位操作转成UNICODE编码,下面会说到)

李1:编码为8101CECE31。81是编码类型,01是长度,CECE是中文编码(0xCECE),31是英文字符的十六进制(0x31)(当英文字符编码在中文编码右边的时候就代表是在中文右边的)

1李:编码为8101CE31CE。81是编码类型,01是长度,CECE是中文编码(0xCECE),31是英文字符的十六进制(0x31)(当英文字符编码在中文编码中间的时候就代表是在中文左边的)

1李2:编码为8101CE31CE32。81是编码类型,01是长度,CECE是中文编码(0xCECE),31是英文字符的十六进制(0x31),32是英文字符的十六进制(0x32)

该中文解码规则(经测试没发现神马问题,有更好的方法可提出来):

李字读取到的编码为CECE,这一串应该理解为0xCECE,把CE右移一位,最后面那位(CE中E的0x1位)记录下来,可以得到67。使用刚才记录的那位与上后面编码CE中C的最高位(0xf位),可以得到4E。经过这个转换,我们把CECE转成了674E,674E就是UNICODE编码,这个怎么变成中文相信大家都知道了。


下面是82编码的解析:

试:编码为82018BD580。82为编码类型,01为长度,8BD5为中文编码,80这里暂不说

试1:编码为82028BD58031。82为编码类型,02为长度,8BD5为中文编码,80分隔英文字符在中文的左边还是右边(如果其右边还有编码,则右边的编码在中文右边)

1试:编码为82028BD53180。82为编码类型,02为长度,8BD5为中文编码,80分隔英文字符在中文的左边还是右边(8BD5与80中间的编码表示英文字符在中文的左边)


1试2:编码为82038BD5318032。82为编码类型,03为长度,8BD5为中文编码,80分隔英文字符在中文的左边还是右边

其中的8BD5编码就是UNICODE编码,相信理解了这个规律要对其进行编解码就容易多了。


这里就暂且记录到此了。


试:编码为82018BD580。82为编码类型,01为长度,8BD5为中文编码,80这里暂不说
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics