为什么手机短信长度限制70个中文、160个英文???

(2012-04-15 00:15:26)

转载

标签:

杂谈

分类:Android
手机短信的长度是由编码决定的,根据国际标准,每条短信最多发送1120位,合(1120÷8=140一个字节占8位)140字节的内容,如果发送纯英文字符,由于英文ASCII采用7位编码,所以1120位的限额可以传送1120÷7=160个字符。一旦传送的字符中包含中文、日文、韩文等双字节字符,不论中文还是西文,不论全角还是半角,都必须采用2个字节的8位编码,因此1120÷8÷2=70个字符,即最多传送70个字。

操作SIM卡中的数据操作主要有两个地方,一个是短信操作,还有一个通讯录操作,两种编码略有差别:

1、短信息操作:

在短信息中,默认一条短信的最大长度为140个字节。

纯ASCII字符主要采用7-bit编码格式,即只是利用了字符的后7位数据,这样160个ASCII字符只占用140个字节。这样我们手机的一条短信就可以发送160个ASCII字符了。

包含汉字的字符采用UCS2编码格式,即UNICODE的2字节编码格式。样每个字符占用两个字节,只要短信中包含中文,整条短信的字符都要采用UCS2编码,这样整个短信最多就只能发送70个字符了。

2、通讯录操作:

通讯录中的姓名长度限制不一样,本人使用的TD模块限制长度为14个字节。

单独的ASCII字符正常都使用8-bit编码格式,即每个字节都占用8位,这也是最为正常的存储格式了。

如果包含中文等字符,则正常采用80编码格式,即整个姓名字符以80开头,后面跟上UCS2数据,但有些情况下又会采用81或者82开头。

a) 80 开头:

    80开头的为ucs2格式(注意:后面的字符必须有中文才行,否则可能是以80开头的纯ASCII字符串),大头在前,小头在后。

例1:中国

UNICODE编码为:4E2D56FD

用ucs2的80方案表示是:804E2D56FD

    例2:杜10娘

    UNICODE编码为:675C003100305A18

用ucs2的80方案表示是:80675C003100305A18

    显然只要有中文,数字也得占用两个字节。

   b) 81 开头:

     81开头的格式中,包含一个基址(一个字节)。有这个基址,就可以用一个字节表示一个ucs2字符了。

在格式上,81是标识,后一个字节表示整个字符串长度,再后面一个字节是基址,再往后的就都是数据了。先举一例:

例3:杜杜杜

UNICODE编码为:675C675C675C

用ucs2的80方案表示是:80675C675C675C

用ucs2的81方案表示是:8103CEDCDCDC

分析一下UCS2的81方案:8103CEDCDCDC

81:为标记

03:表示整个字符串为3个字符

CE:一个字节为基址。解析的方法为:将基址(CE)左移七位,并将最高位置为0,最低位再补一个0(这样就16位啦)。此时基

址变为0x6700,然后再判断后面的数据字节。

DCDCDC:3个数据字节 DC, DC, DC 。如果数据字节的最高位为0,则认为此字节是一个ASCII字符。如果数据字节的最高位为

1,则低7位为基址的一个偏移,实际的UCS2字符为基址加上这个偏移值。由于此处三个数据字节最高位都为1,则实际的3个字符的

偏移值为:5C, 5C, 5C。实际的UCS2编码为: 0x675C 0x675C 0x675C, 此处我们就看的明白了。

例4:一丁丂七丄丅               (注:这些字符属于GBK字符集)

UNICODE编码为:4E004E014E024E034E044E05

用ucs2的80方案表示是:804E004E014E024E034E044E05

用ucs2的81方案表示是:81069C808182838485

分析一下UCS2的81方案:81069C808182838485

81:为标记

06:表示整个字符串为6个字符

9C:一个字节为基址。解析的方法为:将基址(9C)左移七位,并将最高位置为0,最低位再补一个0(这样就16位啦)。此时基址

变为0x4E00,然后再判断后面的数据字节。

808182838485:6个数据字节 80,81,82,83,84,85 。由于此处六个数据字节最高位都为1,则实际的6个字符的偏移值为:00,

01,02,03,04,05。实际的UCS2编码为:0x4E00,0x4E01,0x4E02,0x4E03,0x4E04,0x4E05。 OK。

  c) 82 开头:

     82开头的格式中,包含一个基址(两个字节)。有这个基址,就可以用一个字节表示一个ucs2字符了。

在格式上,81是标识,后一个字节表示整个字符串长度,再后面两个字节是基址,再往后的就都是数据了。先举一例:

例5:8025EF芳

     UNICODE编码为:00380030003200350045004682B3

用ucs2的80方案表示是:8000380030003200350045004682B3

用ucs2的81方案表示是:(因为格式的限制,最多容纳128个中文和127个英文,所以此处无法用81格式表示)

     用ucs2的82方案表示是:82078280383032354546B3

分析一下UCS2的82方案:82078280383032354546B3

    82:为标记

07:表示整个字符串为7个字符

    8280:两个字节为基址。

383032354546B3:7个数据字节 38,30,32,35,45,46,B3。如果数据字节的最高位为0,则认为此字节是一个ASCII字符。如果

数据字节的最高位为1,低7位为基址的一个偏移,实际的UCS2字符为基址加上这个偏移值。由于此处七个数据字节的前六个字节最高

位为0,所以表示6个ASCII字符0x38,0x30,0x32,0x35,0x45,即8025EF。第七个字节的最高位为1,则此数据的

偏移值为0x33,需要加上基址 0x8280,UCS2编码为0x82B3(

例6:杜杜1

     UNICODE编码为:675C675C0031

用ucs2的80方案表示是:80675C675C0031

     用ucs2的81方案表示是:8103CEDCDC31

     用ucs2的82方案表示是:82036700DCDC31

分析一下UCS2的82方案:82036700DCDC31

82:为标记

03:表示整个字符串为6个字符

    6700:两个字节为基址。

DCDC31:36个数据字节 DC,DC,31。由于此处三个字节的前两个字节最高位为1,则此数据的偏移值为0x5C,需要加上基址

0x6700,UCS2编码为:0x675C()。第三个字节的最高位为0,所以表示一个ASCII字符:0x31,即 1 。

此处只是稍微分析了一下UCS2三种格式(80,81,82)的解码,想必知道了各个字段的含义,编码也就轻松多了。

SIM卡中UCS2编码的三种格式(80,81,82)分析相关推荐

  1. 3.13. Notepad++中Windows,Unix,Mac三种格式之间的转换

    由于历史原因,导致Windows,Unix/Linux,Mac三者之间,对于文件中所用回车换行符,表示的方法,都不一样. 这就导致了很多人都会遇到回车换行符的困惑,和需要在不同格式间进行转换. 其中, ...

  2. Notepad++中Windows,Unix,Mac三种格式之间的转换(换行符的转换)

    2019独角兽企业重金招聘Python工程师标准>>> http://www.crifan.com/files/doc/docbook/rec_soft_npp/release/ht ...

  3. [Mailbox]SIM卡中Alpha Identifier域解析

    简介:3GPP TS 11.11的EFADN域详细介绍了手机SIM卡中Alpha Identifier域的组织方法,因为工作中使用到Mailbox name解析,而Mailbox name的解析方法是 ...

  4. 移动支付NFC-SWP方案在SIM卡中的实现方法

    [导读] 本文提出移动支付NFC-SWP连接方案,并使用大容量SIM卡中加以实现.文中,NFC芯片提供射频接口,负责转发射频数据给SIM卡.SIM卡则使用SWP接口实现与NFC芯片的连接. 引言 近几 ...

  5. 读取SIM卡中联系人流程

    本文主要讲USIM卡插入手机后读取卡中contacts信息的流程. 整体流程总结 每次插拔SIM卡都会将联系人数据库中关于SIM卡的联系人删除 SimStateReceiver 通过接收 RIL 上报 ...

  6. 获取手机通讯录 (含SIM卡中的联系人)

    sim卡UIR content://icc/fdn content://sim/fdn MOTO XT800比较异常,通讯录在: content://contacts/phones 1.使用andro ...

  7. MTK平台获取本机的SIM卡中IMSI号

    要求在MTK的代码上获得本机上SIM卡的手机号码,查了很多资料后,结果是无法获得,原因是手机号码不是直接存储在SIM卡的,而是信号通过移动商(移动.联通或电信)时绑定的:IMSI是sim卡的一个属性号 ...

  8. MTK平台 获取本机的SIM卡中IMSI号

    公司MTK平台做开发,老板要求在MTK的代码上获得本机上SIM卡的手机号码,查了很多资料后,结果是无法获得,原因是手机号码不是直接存储在SIM卡的,而是信号通过移动商(移动.联通或电信)时绑定的:IM ...

  9. SIM卡ICCID的编码方案

    ICCID:Integrate circuit card identity 集成电路卡识别码,固化在手机SIM卡中. ICCID为IC卡的唯一识别号码,共有20位数字组成. 其编码格式为:XXXXXX ...

最新文章

  1. Windows中文件夹与linux中目录的区别
  2. JAVA[Algorithm]--戴克斯特拉
  3. python接口测试面试题及答案_100道接口测试面试题收好了!【建议收藏】
  4. java设置窗体居中与去除边框以及jframe设置背景色
  5. 蓝桥杯-删除数组零元素(java)
  6. Python模块之间的相互引用问题
  7. Delphi的Socket编程要分几步?
  8. OpenCV hdr成像技术的实例(附完整代码)
  9. 什么是css sprites,如何使用?
  10. 阿里云助力完美日记半年内系统吞吐量提升50倍
  11. docker tomcat:9.0
  12. 面试题目_数据分析SQL面试题目9套汇总
  13. 最小路径和--p64--动态规划
  14. 清华大学自主研究的计算机,清华大学人工智能研究院成立基础理论研究中心,朱军教授任中心主任...
  15. debian重启ssh服务_VScode链接服务器并配置公钥SSH Keys
  16. opencv在linux设置环境变量,linux下设置opencv环境变量
  17. 啊,久违的 win7 开机画面!
  18. 小米笔记本pro黑苹果原厂intel蓝牙亲测可用!!
  19. 2020最新Java常见面试题及答案
  20. 思科Cisco Telnet(三种认证方式)

热门文章

  1. mmap是什么,为什么?
  2. Android 原生Gallery3d的优化系列--1
  3. Android GoogleMap接入
  4. android google map v2 获取当前位置,如何在google map v2中获取当前位置信息?
  5. beeline 参数
  6. 用python让excel飞起来(第7章 图表操作)
  7. ElasticSearch 索引创建
  8. ubuntu 16.04安装体验网易云音乐
  9. C# ManualResetEventSlim类
  10. @Retention(RetentionPolicy.RUNTIME)