我爱Aspx >> VC.Net >> 通过串口收发短消息(上)需要指出的是,7-bit的字符集与ANSI标准字符集不完全一致,在0x20以下也排布了一些可打印字符,但英文字母、阿拉伯数字和常用符号的位置两者是一样的。用上面介绍的算法收发纯英文短消息,一般情况应该是够用了。如果是法语、德语、西班牙语等,含有 “å”、 “é”这一类字符,则要按上面编码的输出去查表,请参阅GSM 03.38的规定。
8-bit编码其实没有规定什么具体的算法,不需要介绍。
UCS2编码是将每个字符(1-2个字节)按照ISO/IEC10646的规定,转变为16位的Unicode宽字符。在Windows系统中,特别是在2000/XP中,可以简单地调用API 函数实现编码和解码。如果没有系统的支持,比如用单片机控制手机模块收发短消息,只好用查表法解决了。
Windows环境下,用C实现UCS2编码和解码的算法如下:
// UCS2编码 // pSrc: 源字符串指针 // pDst: 目标编码串指针 // nSrcLength: 源字符串长度 // 返回: 目标编码串长度 int gsmEncodeUcs2(const char* pSrc, unsigned char* pDst, int nSrcLength) { int nDstLength; // UNICODE宽字符数目 WCHAR wchar[128]; // UNICODE串缓冲区 // 字符串-->UNICODE串 nDstLength = ::MultiByteToWideChar(CP_ACP, 0, pSrc, nSrcLength, wchar, 128); // 高低字节对调,输出 for(int i=0; i<nDstLength; i++) { // 先输出高位字节 *pDst++ = wchar[i] >> 8; // 后输出低位字节 *pDst++ = wchar[i] & 0xff; } // 返回目标编码串长度 return nDstLength * 2; } // UCS2解码 // pSrc: 源编码串指针 // pDst: 目标字符串指针 // nSrcLength: 源编码串长度 // 返回: 目标字符串长度 int gsmDecodeUcs2(const unsigned char* pSrc, char* pDst, int nSrcLength) { int nDstLength; // UNICODE宽字符数目 WCHAR wchar[128]; // UNICODE串缓冲区 // 高低字节对调,拼成UNICODE for(int i=0; i<nSrcLength/2; i++) { // 先高位字节 wchar[i] = *pSrc++ << 8; // 后低位字节 wchar[i] |= *pSrc++; } // UNICODE串-->字符串 nDstLength = ::WideCharToMultiByte(CP_ACP, 0, wchar, nSrcLength/2, pDst, 160, NULL, NULL); // 输出字符串加个结束符 pDst[nDstLength] = ´\0´; // 返回目标字符串长度 return nDstLength; }
【我对这篇文章有话说?】
A LITE VIRUS ABOUT PE INFECT[05-21]
让应用程序从IE中获取键入的网址[05-21]
Don Box:Smart Pointers : What..[05-21]
企业上网的几个理由[05-21]
如何在Linux下实现设备的配置[05-21]
非窗口类中使用定时器的方法(二..[05-21]
非窗口类中使用定时器的方法(一..[05-21]
非窗口类中使用定时器的方法[05-21]
深度探索win32可执行文件格式[05-21]
const用法的体会[05-21]