首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | HR | 镜像
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
搜索中心 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>编程开发>cc++>正文

SMS中用Unicode编码发送中文的办法

http://www.oklinux.cn  2007-02-09  oklinux收集整理   会员收藏  游客收藏  【 】 
您查看的文章来源于http://www.oklinux.cn


  SMS是由Esti 所制定的一个规范(GSM 03.40 和 GSM 03.38)。有两种方式来发送和接收SMS消息:文本模式或者PDU(protocol description unit)模式。文本模式只能发送普通的ASCII字符,而要发送图片、铃声、其它编码的字符(如中文)就必须采用PDU模式。
  
  PDU模式中,可以采用三种编码方式来编码要发送的内容,分别是 7-bit编码、8-bit编码、16-bit编码。7-bit编码用于发送普通的ASCII字符;8-bit编码通常用于发送数据消息,比如图片和铃声等;而16-bit编码用于发送Unicode字符。在这三种编码方式下,可以发送的最大字符数分别是 160、 140、 70。
  
  若要发送中文(或日文等),必须采用PDU模式的Unicode编码方式。
  
  我最近参与了一个在linux下收发短信的项目。其中,需要实现中文的发送和接收。由于原来没有中文编码、Unicode编码的经验,所以查了一些资料,也在一些论坛上提了一些问题。现在把它整理出来,希望对以后再做类似项目的朋友有个帮助。我写的比较简单,关于PDU的规范,可以看这里:http://www.ascend-tech.com.cn/sustain/SMS_PDU-mode.pdf ,或者去wavecom的网站上找找看。
  
  1、 GB2312 编码到Unicode 编码的转换
  在 Redhat 7.3系统上,默认是用GB2312编码保存中文字符的(对于中英文混合的文本也是如此)。所以首先需要把 GB2312 编码的字符串转换到 Unicode编码的字符串。GB2312编码是一种多字节编码方式,对于中文,用2个字节表示,对于英文,用1个字节表示,就是英文的ascii码。(注:我没有仔细看过GB2312编码的规范,以上理解是实际开发中得出来的,不能保证正确性)。Unicode编码是双字节编码方式,对所有字符,都采用2个字节编码。在linux平台上,GB2312编码到Unicode编码的转换,可以有三种实现方式(或者更多):
  1)、用 mbstowcs () 函数。就是多字节编码到宽字符的转换。我试过它,可以正确的转换,但是这个函数可能不是很可靠。
  
  2)、用 GB2312 à Unicode 的转换表,手动查表转换。网上有这样的转换表,你需要对每一个GB2312字符,根据它是中文字符还是英文字符,分别转换。
  
  3)、用 iconv () 函数。这可能是linux上的标准的方法,不仅可以转换GB2312到Unicode,还可以在任意的两种编码之间转换(前提是linux系统要支持这些编码)。
  首先要用 iconv_open(), 打开一个转换句柄,指定两种转换前的编码和转换后的编码。
  然后用 icnov() 作转换。最后用 iconv_close()关闭句柄,释放资源。
  
  #include <iconv.h>
  
  #define BUFLEN 200
  char inbuf[BUFLEN];
  char outbuf[BUFLEN];
  char* pin = inbuf;
  char* pout = outbuf;
  
  …打开文件,读入GB2312数据到inbuf,数据长度为 len
  
  int inleft = len;
  int outleft = BUFLEN;
  
  iconv_t cd;
  if((cd = iconv_open(“gb2312”, “unicode”)) == (iconv_t)-1)
  return ?1;
  if(iconv(cd, &pin, &inleft, &pout, &outleft) == (size_t)-1)
  return ?1;
  iconv_close(cd);
  
  使用 iconv () 时,需要注意参数的使用,inleft 是输入缓冲区数据数据长度,outleft是输出缓冲区大小。(需要保证输出缓冲区足够大)。
  转换以后,outleft 是outbuf中空闲空间的大小,所以 BUFLEN-outleft 才是真正的Unicode数据长度。
  注意:不论是GB2312编码,还是Unicode编码,在内存中都是一些字节序列,所以我们可以统一用 类型为 char(或者unsigned char)的字符数组来保存。所以,BUFLEN-outleft 是 字符(char)个数,而不是Unicode字符个数。
  
  2、 Unicode 编码到 16-bit 编码的转换
  在得到 Unicode编码以后,还需要转换到 PDU 的16-bit 编码,才可以正确的发送。在这个转换过程中,需要注意两点:
  1)、Unicode 编码最开始的 0xFEFF标志要被去除,在0xFEFF之后的内容,才是真正的Unicode字符。(至于为什么有这个0xfeff标志,知道的朋友告诉我一声,呵呵)。
  
  2)、Unicode 是双字节字符,由于我的系统是小端字节序(little-endian),也就是说,在存储的时候,是先低位,后高位,例如“中”的Unicode编码是 0x4E2D,存储的时候是 2D4E,在转换到 16-bit编码的时候,要注意这个顺序的不同。当然,如果你的系统是大端字节序(big-endian),那么就不用这样做了。
  
  OK,关于如何将 0x4E2D 的Unicode编码转换到 “4E2D” 的16-bit编码,我就不多写了。
  
  3、正确计算16-bit 编码的消息体长度
  4、正确设置 First-Octet 、TP-MR、TP-PID、TP-DCS、TP-VP
  在PDU格式中,First-Octet 、TP-MR、TP-PID、TP-DCS、TP-VP的设置正确与否,对能否发送 Unicode 至关重要。根据协议规范以及我的调试结果,以上几个标志的正确设置分别为(都是16进制):
  First-Octet : 11
  TP-MR : 00
  TP-PID : 00
  TP-DCS : 08 (编码方式,16-bit)
  TP-VP : A7




上一篇:Linux下C++异常处理技巧-实例讲解   下一篇:SourceInsight3.0:Linux源代码阅读

收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·Linux下C++异常处理技巧-实例讲解
·SourceInsight3.0:Linux源代码阅读
·解析Linux下的并口编程(英文版)
·轻松就能让Linux下的C编程从头来
·C++中关于指针入门的最好的文章
·新手学习之浅析一下c/c++中的指针
·关于C++代码优化的方法总结(一)
·GNUC库----调试系统问题并进行修订
·C++常用字符串处理函数及使用示例
·用C与脚本的混合编程来处理配置文件
·使用profile来得到程序运行信息
·Linux下C语言编程--时间概念
·在CMP实体BEAN中使用BLOB数据类型
·linux下命令行下编译c程序
·在C/C++中如何构造通用的对象链表
·GCC内嵌汇编之语法详解
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·Turbo C 2.0 认识
·用Eclipse平台进行C/C 开发
·在 Linux 中使用共享对象
·VS:针对Java开发人员的C#编程语言
·使用智能设备扩展在C#中开发自定义控件
·Visual C# 常见问题
·二级C语言实例解答
·一种被忽视的构造和整数溢出重现
·轻轻松松C to C
·与用于 C 的ISO标准保持一致
·用C 的托管扩展针对Windows编程
·运行时和编译时的安全性检查
  阅读排行
·c/c++ 学习-read 函数和 write 函数
·c/c++ 学习-open 函数
·使用 GDB 调试多进程程序
·用Win-TC编译与用TC2.0编译的差异
·细述C/C 字符指针数组及指向指针的含
·感触C语言中的面向对象思想
·C语言程序源代码下载
·Linux下C开发环境的构成与安装
·用Eclipse平台进行C/C 开发
·GCC内嵌汇编之语法详解
·C调用Tcl脚本
·Linux下的多进程编程
·TServerSocket和TClientSocket的使用
·C++字符串转换篇
·初学者编程入门:C 指针使用方法
网摘收藏: