主题 : 新手求救嵌入式LINUX中字符转换问题!!! 请诸位不吝赐教~ 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 23302
精华: 0
发帖: 2
金钱: 10 两
威望: 2 点
综合积分: 4 分
注册时间: 2010-06-17
最后登录: 2010-06-21
楼主  发表于: 2010-06-17 14:47

 新手求救嵌入式LINUX中字符转换问题!!! 请诸位不吝赐教~

其实是比较常见的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上可以成功打印"你好" 在嵌入式上也是空格...
}
级别: 新手上路
UID: 23302
精华: 0
发帖: 2
金钱: 10 两
威望: 2 点
综合积分: 4 分
注册时间: 2010-06-17
最后登录: 2010-06-21
1楼  发表于: 2010-06-18 08:57
真的没有人做过这方面的东西啊?
PDU短信不是很常见的吗?
哪位高手指点一下吧...
怀疑是字符集设置的问题..
setlocale貌似无效...
级别: 新手上路
UID: 21584
精华: 0
发帖: 9
金钱: 45 两
威望: 9 点
综合积分: 18 分
注册时间: 2010-05-18
最后登录: 2017-09-13
2楼  发表于: 2011-09-29 22:23
您好,请问你之后解决这个问题了吗?我也遇到了和你一样的问题,该怎么解决呢?十分感谢