单片机/MCUwilliam hill官网
直播中

def_2

12年用户 59经验值
私信 关注
[文章]

请问用51单片机怎么将unicode码转换成GB2312码?

我现在要用到GB2312码,不过串口的数据是U码,现在涉及到将U码转化成GB码的问题。

在网上查了一些资料,有的是用查表的方法得到的,而映射表的数组非常庞大(全部可能要128K),51单片机的存储空间有限,请问用什么方法可以扩展?

还有如果我用高通的字库芯片GT21H16S2Y,可以将U码转化成GB码吗?能不能提供下程序?

各位大神是怎么做到的,不胜感激~~~

回帖(22)

宋志标

2013-7-21 06:04:26
本帖最后由 爱我别走 于 2013-7-22 01:34 编辑

方法一,如果你的单片机存储空间够大,你可以用查表发。附件里面有一个gb2uni.h的文件,              可以很方便的在GBK和Unicode码之间相互转换。
方法二,使用字库芯片,如高通GT21L16S2W,***给你,实测可用。通过你的描述,
              我推测你应该是在做单片机控制GPRS模块收发短信吧。
  /*-------------------------------------------        
  引脚连接宏定义
------------------------------------------------*/
***it GT_CS = P2^0;
***it GT_SO = P2^1;
***it GT_SI = P2^2;
***it GT_CLK = P2^3;
/*--------------------------------------------------
        函数名  :ReadByte
        功能    :读取任意地址数据
        输入参数:
        输出参数:               
---------------------------------------------------        */
unsigned char ReadByte(unsigned long Address)
{
          unsigned char i = 0,j = 0,temp = 0x0B;
        GT_CS = 0;
          //发送指令
          for(i=0; i<8; i++)
          {
                        GT_CLK = 0;
                         GT_SI = temp&0x80;
                         temp <<= 1;
                         GT_CLK = 1;
            }
               
                //发送地址
             for(j=1; j<4; j++)
                {
                          temp = ( (unsigned char*)&Address )[j] ;
                                for(i=0; i<8; i++)
                                {
                                         GT_CLK = 0;
                                         GT_SI =temp & 0x80;
                                         temp <<= 1;
                                         GT_CLK = 1;
                                }
                                
                }        

    //发送空字节
          for(i=0; i<8; i++)
          {
                        GT_CLK = 0;
                         GT_SI = 0;
                         GT_CLK = 1;
    }        
               
                 //接收数据
                   for(i=0; i<8; i++)
                        {                                
                                   GT_CLK = 0;
                                   temp <<= 1;
                                         if(GT_SO)
                                      temp |= 0x01;
                                         else
                                           temp &= 0xFE;
                                          GT_CLK = 1;                                 
       }
                        
                 GT_CS = 1;
                 return temp;         
                                
}

/*--------------------------------------------------
        函数名  :UnicodeToGB2312
        功能    :Unicode 到GB2312 内码转换程序
        输入参数:srcCode Unicode码
        输出参数:destCode GB2312码        
---------------------------------------------------        */
void UnicodeToGB2312(unsigned char*srcCode,unsigned char*destCode)
{
                unsigned long ptr;
                unsigned char result=0;
                unsigned int h;
                unsigned int Code;
                Code = *srcCode++;
                Code = (Code<<8) + *srcCode;
                if(Code<0xa0) result=1;
                else if(Code<=0xf7) h=Code-160;
                else if(Code<0x2c7) result=1;
                else if(Code<=0x2c9) h=Code-160-463;
                else if(Code<0x2010) result=1;
                else if(Code<=0x2312) h=Code-160-463-7494;
                else if(Code<0x2460) result=1;
                else if(Code<=0x2642) h=Code-160-463-7494-333;
                else if(Code<0x3000) result=1;
                else if(Code<=0x3017) h=Code-160-463-7494-333-2493;
                else if(Code<0x3220) result=1;
                else if(Code<=0x3229) h=Code-160-463-7494-333-2493-520;
                else if(Code<0x4e00) result=1;
                else if(Code<=0x9b54) h=Code-160-463-7494-333-2493-520-7126;
                else if(Code<0x9c7c) result=1;
                else if(Code<=0x9ce2) h=Code-160-463-7494-333-2493-520-7126-295;
                else if(Code<0x9e1f) result=1;
                else if(Code<=0x9fa0) h=Code-160-463-7494-333-2493-520-7126-295-316;
                else if(Code<0xe76c) result=1;
                else if(Code<=0xe774) h=Code-160-463-7494-333-2493-520-7126-295-316-18379;
                else if(Code<0xff00) result=1;
                else if(Code<=0xff5f) h=Code-160-463-7494-333-2493-520-7126-295-316-18379-6027;
                else if(Code<0xffe0) result=1;
                else if(Code<=0xffe5) h=Code-160-463-7494-333-2493-520-7126-295-316-18379-6027-128;
                else result=1;
                if(result==0)
                {
                        ptr = 0x67d70 + (h<<1);
                        *destCode++ = ReadByte(ptr++);
                        *destCode = ReadByte(ptr);
                }
                else
                {
                        *destCode++ =*srcCode;
                        *destCode = ' ';
                }
               
}










举报

def_2

2013-7-21 06:23:22
希望有人来帮忙~~
举报

h1654155205.7018

2013-7-22 00:05:50
这个真不知道  你自己去查查
举报

def_2

2013-7-22 06:59:36
本帖最后由 def_2 于 2013-7-22 07:02 编辑
引用: 爱我别走 发表于 2013-7-22 01:29
方法一,如果你的单片机存储空间够大,你可以用查表发。附件里面有一个gb2uni.h的文件,              可以 ...

非常感谢~~现在还有一些问题,我用了你的后一个代码。

请问是这样调用有错吗?

        unsigned char xdata  GB2312[30];               
        unsigned char xdata UNICODE[30];    //提取后的汉字U码缓冲区

        for(i=0;i<30;i++)
        {
                 UnicodeToGB2312(UNICODE[i ],GB2312[i ]);        
        }


为什么提示错误 error C214: illegal pointer conversion  ??
举报

宋志标

2013-7-22 10:07:37
引用: def_2 发表于 2013-7-22 06:59
非常感谢~~现在还有一些问题,我用了你的后一个代码。

请问是这样调用有错吗?

   参数要传递指针,所以要这样改下,
修改一,
       unsigned char xdata  GB2312[30];               
        unsigned char xdata UNICODE[30];    //提取后的汉字U码缓冲区

        for(i=0;i<30;i+=2)
        {
                 UnicodeToGB2312(&UNICODE[i ],&GB2312[i ]);        
        }




修改二,
       unsigned char xdata  GB2312[30];               
       unsigned char xdata UNICODE[30];    //提取后的汉字U码缓冲区

        for(i=0;i<30;i+=2)
        {
                 UnicodeToGB2312(UNICODE+i,GB2312+i);        
        }



举报

def_2

2013-7-22 19:33:55
引用: 爱我别走 发表于 2013-7-22 10:07
参数要传递指针,所以要这样改下,
修改一,
       unsigned char xdata  GB2312[30];                ...

为什么 i 改成了 i +=2  ??
举报

宋志标

2013-7-22 20:08:44
引用: def_2 发表于 2013-7-22 19:33
为什么 i 改成了 i +=2  ??

unicode码是用双字节表示一个字符的啊,所以i+=2;
举报

def_2

2013-7-22 20:45:14
引用: 爱我别走 发表于 2013-7-22 20:08
unicode码是用双字节表示一个字符的啊,所以i+=2;

那就是说,比如汉字“电子”的UNICODE内码为0x7535,0x5b50,GB2312内码为0xb5e7,0xd7d3在数组中表示应该如下
UNICODE[30] = {
        0x75,0x35,         //电
        0x5b,0x50,         //子
}


经过函数转换成功后,得到如下数组,对吗??
GB2312[30] =
{
       0xb5,0xe7,         //电
       0xd7,0xd3,        //子
}






举报

宋志标

2013-7-22 20:59:03
引用: def_2 发表于 2013-7-22 20:45
那就是说,比如汉字“电子”的UNICODE内码为0x7535,0x5b50,GB2312内码为0xb5e7,0xd7d3在数组中表示应该 ...

对的。
举报

def_2

2013-7-22 22:01:50

如果这样的话,两个汉字的UNICODE有4个字节,对应转换后的GB2312也应该是4个字节哈,那就是要循环 i 次,为什么还加2啊?
举报

宋志标

2013-7-23 17:52:48
引用: def_2 发表于 2013-7-22 22:01
如果这样的话,两个汉字的UNICODE有4个字节,对应转换后的GB2312也应该是4个字节哈,那就是要循环 i 次, ...

两个汉字,对应四个字节,但只需要循环两次,因为转换函数是以两个字节为单位的。
举报

北啵

2013-10-23 20:52:38

请问您的这个读任意地址数据readbyte函数,是怎么做到读取的呢,GT21这个字库芯片的快速读不应该是先写1字节0b,然后3字节地址,你这不是取得四字节地址的后三字节吗?
举报

Darcy

2014-8-25 10:05:34
引用: 爱我别走 发表于 2013-7-21 06:04
方法一,如果你的单片机存储空间够大,你可以用查表发。附件里面有一个gb2uni.h的文件,              可以 ...

正在做这方面的程序,想问下 方法一  有没有相应的基于查表的转换程序???
举报

Darcy

2014-8-25 10:06:00
引用: 爱我别走 发表于 2013-7-21 06:04
方法一,如果你的单片机存储空间够大,你可以用查表发。附件里面有一个gb2uni.h的文件,              可以 ...

正在做这方面的程序,想问下方法一 有没有相应的基于查表的转换程序?
举报

wyb552044481

2014-8-28 12:29:12
good gan jue bu cuo de yang zi
举报

sbreathe

2015-1-28 06:34:54
引用: elysium 发表于 2014-8-25 10:06
正在做这方面的程序,想问下方法一 有没有相应的基于查表的转换程序?
...

你好,我也在做单片机控制GSM模块收发短信的项目,你的问题解决了吗?怎么用查表的方式把unicode码转换成GBK的?
举报

lyh1987a

2015-1-30 15:07:44
正在做这方面的程序
举报

梁叶斌

2015-4-7 19:19:43
查表法怎么做???同求。。。谢谢!!
举报

aaronjedi

2015-4-8 09:44:00
谢谢!正在做这方面的东西
举报

更多回帖

发帖
×
20
完善资料,
赚取积分