其实是比较常见的GSM短信问题 就是实现短信内容的PDU格式转换
我采用了mbstowcs和wcstombs两个函数来实现格式转换 在PC的虚拟机中gcc编译通过后可以实现 中英文转换都没有问题 例如"你好"通过转换后成为8个字符的字符串4F60597D 但是用arm-linux-gcc交叉编译后放入2440中 就只能转换英文了 中文输入后貌似直接被转为空格? 不知道是不是嵌入式linux中缺少了GB2312的字符集?希望有人能帮我答疑解惑一下~
PS:我也试过用iconv函数 使iconv_t cd=iconv_open("GB2312","UCS-2");的句柄 但是在嵌入式linux中中英文都无法实现转换!! 而且这个方法在PC上也只能实现纯中文的转换 英文和标点符号都不能转换...o(╯□╰)o
PPS:不一定使用那两个函数 只要能实现短信的PDU格式转换就可以了 如果大家还有别的可行的办法请告诉我一声
以下为我的程序:
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int EncodeUCS2(unsigned char *SourceBuf,unsigned char *DestBuf)
{
int len,i,j=0;
unsigned char temp[255];
wchar_t wcbuf[255];
setlocale(LC_ALL,"");
len = mbstowcs(wcbuf,SourceBuf,255); /* convert mutibytes string to wide charater string */
for (i=0;i<len;i++)
{
temp[j++] = wcbuf>>8; /* height byte */
temp[j++] = wcbuf&0xff; /* low byte */
}
for(i=0;i<len*2;i++)
{
DestBuf[i*2]=(temp>>4)&0x0F;
DestBuf[i*2+1]=temp&0x0F;
}
for(i=0;i<len*4;i++)
{
if(DestBuf<10)DestBuf+=48;
else DestBuf+=55;
}
return len*2;
}
int DecodeUCS2(unsigned char *SourceBuf,unsigned char *DestBuf,int len)
{
wchar_t wcbuf[255];
unsigned char temp[255];
int i;
setlocale(LC_ALL,"");
for(i=0;i<len;i++)
{
if(SourceBuf<=57)SourceBuf-=48;
else if(SourceBuf<=70)SourceBuf-=55;
else SourceBuf-=87;
}
for(i=0;i<len/2;i++)
{
temp=(SourceBuf[i*2]<<4)+SourceBuf[i*2+1];
}
for( i=0;i<len/4;i++ ) {
wcbuf=temp[2*i]; // height byte
wcbuf=(wcbuf<<8)+temp[2*i+1]; // low byte
}
return wcstombs(DestBuf,wcbuf,len/2); /* convert wide charater string to mutibytes string */
}
int main()
{
int i=0,len,j=0;
char c[255],buf[255],d[255];
scanf("%[^\n]",c); // 这里输入"你好" 回车结束
getchar();
memset(buf,0,255);
memset(d,0,255);
len=EncodeUCS2(c,buf);
printf("%s\n",buf); //这里打印转换后的格式 在虚拟机linux上可以打印4F60597D 长度为8 在嵌入式linux上是空格...
i=DecodeUCS2(buf,d,strlen(buf));
printf("%s\n",d); //这里打印解码结果 在虚拟机linux上可以成功打印"你好" 在嵌入式上也是空格...
}