网上看到一篇比较好的说ucs2编码的文章,保存一下,原文地址:
http://hi.baidu.com/youren4548/blog/item/fa08bd1bf61005058618bf1d.html
操作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,即8,0,2,5,E,F。第七个字节的最高位为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)的解码,想必知道了各个字段的含义,编码也就轻松多了。
分享到:
相关推荐
UCS2 3种编码间的切换实现! 函数会优先使用81和82格式编码,如果不满足编码条件,选择80格式编码! 具体实现请查看源码!
ASCII码及UCS2编码转换器,包含中文编解码,C#编写,用过都说好,ASCII码及UCS2编码转换器,包含中文编解码,C#编写,用过都说好,
发送中文短信,会用到UCS2编码,很多网友反应中文发送和接收乱码,这个烦恼可以解决了。 注意:要在系统配置里增加 LANG=zh_CN.GB18030 export LANG 语言配置不对,这个函数会出错的,另外,例子有点问题,换一个...
Sim卡中的ucs2格式 Sim卡中的中文都是以ucs2...Ucs2本身有3种格式,常用的是80格式,即80开头,每两个字节表示一个字符,还有81,82格式,后两种可以用一个字节表示一个汉字。80,81,82,gb2312在特定条件下可以互换。
GB2312,UTF8,UCS2汉字编码生成与转换
汉字UCS-2编码表.doc
用于短信 7bit 8bit ucs2编码和解码
详细描述UTF8和UCS2的 编码规则,并附带互相转换的c++源代码
ucs2/7bit/8bit/ASCII/ UTF-8与中文(英文)间自由切换,粘贴自动切换。对短信开发有用。
PHP实现UCS2编码解码 手机发送短信时编码
实例32 <br>稿件名称:中英文手机短信PDU编码(UCS2)解码(UCS2,7-Bit) C# 程序 <br>稿件作者:李仓海 <br>程序名称:TC35iSMS <br>运行环境:TC35iSMS <br>注意事项:
包含短信的格式介绍,ucs2编码,c语言代码
身份证读卡器生成的基本信息TEXT文件,由于是采用 GB 13000 的 UCS-2 编码格式,java读取出来是乱码,这个段代码就是解决转码问题的,亲测可用
1,消息编码与解码 1),用C实现7-bit编码和解码的算法 2),用C实现UCS2编码和解码的算法 2,消息的发送(PDU编解码) 1),发送短消息 2),读取短消息 3),删除短消息 3,串口读写短信
可以实现UCS2码和汉字的互相转换,采用VB编写
ucs2 Gbk互转的code_自己写的,不使用iconv函数
ucs2编码[归纳].pdf
// GB2312的编码为两个字节,转UTF编码后有3个字节,转UCS编码有2个字节。 // Unicode编码会用UCS-BIG或者UCS-LITTLE(大端或者小端),它们的区别就是高低字节位置不同。 //比如中文编码 // “哈”: // GB2312 0xB...
嵌入式字符编码(经典)(ucs2,+unicode,+utf8,+gb2312)[借鉴].pdf
UCS utf8编码转化大全~~~各种编码形式转换