tanguicaicai 发表于 2012-5-8 09:15:31

汉字索引的问题

typedef struct typFNT_GB16               // 汉字字模数据结构
{
       signed char Index;               // 汉字内码索引
       char Msk;                     // 点阵码数据
};

/////////////////////////////////////////////////////////////////////////
// 汉字字模表                                                          //
// 汉字库: 宋体16.dot,横向取模左高位,数据排列:从左到右从上到下         //
/////////////////////////////////////////////////////////////////////////
struct typFNT_GB16 code GB_16[] =          // 数据表
{
"爱", 0x00,0x78,0x3F,0x80,0x11,0x10,0x09,0x20,
      0x7F,0xFE,0x42,0x02,0x82,0x04,0x7F,0xF8,
      0x04,0x00,0x07,0xF0,0x0A,0x20,0x09,0x40,
      0x10,0x80,0x11,0x60,0x22,0x1C,0x0C,0x08,

"你", 0x11,0x00,0x11,0x00,0x11,0x00,0x23,0xFC,
      0x22,0x04,0x64,0x08,0xA8,0x40,0x20,0x40,
      0x21,0x50,0x21,0x48,0x22,0x4C,0x24,0x44,
      0x20,0x40,0x20,0x40,0x21,0x40,0x20,0x80
};


void dprintf(uchar col,uchar layer,uchar *ptr)//ASCII的汉字混合显示程序
{
      uchar c1,c2;
      uchar i,j,k;
      uchar ulen;
      uchar ucol,ulayer;
      ulen=0;
      ucol=col;
      ulayer=layer;
      i=0;
      while(ptr!='\0') ulen++;//判断字符串的长度

      while(i<ulen)
      {
                c1=ptr;
                c2=ptr;



                if(c1<=128)//字符和汉字的分界线
                {
                        显示字符的没问题
                        i++;
                }
                else
                {
                        for(j=0;j<255;j++)
                        {
                              if((c1==GB_16.Index)&&(c2==GB_16.Index))//索引汉字.....这里查找汉字什么就是找不到?
                              {这里显示汉字什}
                        }
                     
                        ucol+=16;
                        i+=2;
                        }
                }
      }



主函数调用dprintf(1,1,“爱你”)时查找不到汉字、还有索引用c1=ptr和第个字,c2=ptr;算是第二个字了,我有点搞不明白,
一个汉字是有两个内码,但什么把它分出来啊、各位大虾懂的和小弟说说啊?

tanguicaicai 发表于 2012-5-8 09:16:21

在线等我哦,搞了几天搞不下啊、帮帮忙啊

shangdawei 发表于 2012-5-8 09:43:15

signed char Index;               // 汉字内码索引

===>

unsigned char Index;               // 汉字内码索引

shangdawei 发表于 2012-5-8 09:46:18

本帖最后由 shangdawei 于 2012-5-8 09:47 编辑

>> 一个汉字是有两个内码,但什么把它分出来啊

不想分开, 可以试试这个

typedef struct _typFNT_GB16               // 汉字字模数据结构
{
       unsigned short Index;               // 汉字内码索引
       char Msk;                     // 点阵码数据
} typFNT_GB16;

typFNT_GB16 GB_16[] =          // 数据表
{
'爱',// 0xB0AE

      0x00,0x78,0x3F,0x80,0x11,0x10,0x09,0x20,
      0x7F,0xFE,0x42,0x02,0x82,0x04,0x7F,0xF8,
      0x04,0x00,0x07,0xF0,0x0A,0x20,0x09,0x40,
      0x10,0x80,0x11,0x60,0x22,0x1C,0x0C,0x08,

'你', // 0xC4E3

      0x11,0x00,0x11,0x00,0x11,0x00,0x23,0xFC,
      0x22,0x04,0x64,0x08,0xA8,0x40,0x20,0x40,
      0x21,0x50,0x21,0x48,0x22,0x4C,0x24,0x44,
      0x20,0x40,0x20,0x40,0x21,0x40,0x20,0x80
};


if( (c1*256+c2) ==GB_16.Index )
{

}

tanguicaicai 发表于 2012-5-8 09:47:28

shangdawei 发表于 2012-5-8 09:46 static/image/common/back.gif
>> 一个汉字是有两个内码,但什么把它分出来啊

不想分开, 可以试试这个


谢谢大哥啊、

tanguicaicai 发表于 2012-5-8 09:52:54

还有啊,大虾,我在网上看到c1=ptr和第个字,c2=ptr;这算是第二个字了,什么会是一个汉字内码啊。我有点搞不明白,
希望能解答一下哦

hxlwb 发表于 2012-5-8 11:38:39

可以查询那个汉子码

tanguicaicai 发表于 2012-5-8 11:45:34

hxlwb 发表于 2012-5-8 11:38 static/image/common/back.gif
可以查询那个汉子码

c2=prt这个不就是字符串的第二个字符了吗、什么会是第一个字的第二个内码啊????

tanguicaicai 发表于 2012-5-9 17:21:52

什么都没有人回答了哦、{:cry:}。我又看到有的用c1=ptr;c2=ptr;就是查两个字吗、
有可能是一句子,什么只查第一个和第二个就可以知道后面汉字的内码了吗?{:cry:}


tanguicaicai 发表于 2012-5-9 17:22:32

没人能解答一下啊~~~

jeffwei 发表于 2012-5-9 17:33:25

tanguicaicai 发表于 2012-5-9 17:22 static/image/common/back.gif
没人能解答一下啊~~~

提示你你一下
char是8bit的,汉字索引是16位的

zhwm3064 发表于 2012-5-9 17:37:47

我和你在研究同一个问题,好几天了,也调不来显示 总是显示乱码

zhwm3064 发表于 2012-5-9 17:46:28

// ------------------汉字字模的数据结构定义 ------------------------ //
flash structtypFNT_GB16   // 汉字字模数据结构
{
       unsigned charIndex;               // 汉字内码索引       
       unsigned char   Msk;                        // 点阵码数据
};
/////////////////////////////////////////////////////////////////////////
// 汉字字模表                                                          //
// 汉字库: 宋体16.dot,横向取模左高位,数据排列:从左到右从上到下         //
/////////////////////////////////////////////////////////////////////////
structtypFNT_GB16 flash codeGB_16 =          // 数据表
{//这个 可能是 传说中的 结构体 数组

/*--文字:一--*/
/*--宋体12;此字体下对应的点阵为:宽x高=16x16   --*/
"主",0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

zhwm3064 发表于 2012-5-9 17:48:23

主程序里调用的这一句:
OLED_PutString(0x1c,0,"科技");delay_ms(8000);
其中0x1c ,0 是要显示的字的座标,这座标没有问题。

zhwm3064 发表于 2012-5-9 17:49:31

void OLED_PutString(unsigned int x, unsigned int y,unsigned char flash *s)
{
       unsigned int l=0;
        while(*s) {
                if( *s < 0x80)
                  {
                        OLED_PutChar(x+l*2,y,*s);
                        s++;l++;
                  }
                else
                  {
                        PutGB1616(x+l*2,y,(unsigned char *)s);
                        s+=2;l+=2;
                  }
                }
}

zhwm3064 发表于 2012-5-9 17:53:24

void PutGB1616(unsigned int x, unsigned int y, unsigned char c)
{
        unsigned int i,j,k;

        OLED_SetPos(x,x+4-1,y, y+16-1);

        for (k=0;k<64;k++)
        { //64标示自建汉字库中的个数,循环查询内码
          if ((codeGB_16.Index==c)&&(codeGB_16.Index==c))
          {   
             //unsigned int m = codeGB_16.Msk;
                 for(i=0;i<32;i++)
                 {    //16*16=256点32*8=256
                    unsigned char m = codeGB_16.Msk;
                  unsigned char m2;
                        m2=m&0b11000000;
                       
                        send_2bit(m2);
                       
                        //send_2bit(0x00);
                        m2=m&0x30;
                        m2<<=2;
                       
                        send_2bit(m2);
                       
                        //send_2bit(0xff);
                        m2=m&0x0c;
                        m2<<=4;
                        send_2bit(m2);
                       
                        //send_2bit(0x00);
                        m2=m&0x03;
                        m2<<=6;
                        send_2bit(m2);
                       
                        //send_2bit(0xff);
                  
                }
          }
        }       
}

myqiang1990 发表于 2012-5-9 18:05:50

一个汉字两个字节..如果是汉字,在计算机里面就是两个字节的内码...你可以KEIL软仿调试的。。可以看见汉字内码在内存的如何存放的。。。然后再用一个简单的汉字内码查看器,看看是不是对上了。。计算机都是一个一个字节的存放的。。不管是什么东西。。。所以汉字是是两个字节,那么ptr就是汉字的第一个内码字节,ptr就是以起始地址偏移1个字节,就是汉字的第二个内码字节。。如果是ASCII码,那么才是你说的第二个字符,因为ASCII是在内存中只占一个字节的。。。

myqiang1990 发表于 2012-5-9 18:12:16

http://www.ourdev.cn/thread-4099591-1-1.html看我的回复。。。楼主。。。

zhwm3064 发表于 2012-5-9 18:52:52

myqiang1990 发表于 2012-5-9 18:12 static/image/common/back.gif
http://www.ourdev.cn/thread-4099591-1-1.html看我的回复。。。楼主。。。

为什么有些signed char Index; 是3,有些是2呢?
我觉得应该是2,可是改成2 .编译不通过,报错

zhwm3064 发表于 2012-5-9 18:57:10

我觉得我的程序,就是在数组里面 寻找汉字内码时,对应错误

我有两个问题搞不懂
1 是 为什么有些signed char Index; 是3
2 是 if( *s < 0x80)
                  {
                        OLED_PutChar(x+l*2,y,*s);
                        s++;l++;
                  }
                else
                  {
                        PutGB1616(x+l*2,y,(unsigned char *)s);
                        s+=2;l+=2;
                  }
上面这句,里面有个(unsigned char *)s,搞不懂这是什么意思

myqiang1990 发表于 2012-5-9 19:49:09

zhwm3064 发表于 2012-5-9 18:57 static/image/common/back.gif
我觉得我的程序,就是在数组里面 寻找汉字内码时,对应错误

我有两个问题搞不懂


把报错的信息发来看看

zhwm3064 发表于 2012-5-9 21:26:07

myqiang1990 发表于 2012-5-9 19:49 static/image/common/back.gif
把报错的信息发来看看

Error:H\shengju\手持机程序\初步显示\GB1616.h(16).included from:初步.c:too many inintializers

zhwm3064 发表于 2012-5-9 21:31:50

我的程序是引用了别人在Keil上的程序,他的程序是用于LCD显示的,
我把程序改了下,用在CVAVR上,另外是用在OLED显示上,现在显示是没问题,因为我在上面的程序上改了下试验,可以显示正常。(改成后面那句就可以显示了send_2bit(m2); //send_2bit(0xff);)
这正明,就是,汉字内码引用时没有 对上号

zhwm3064 发表于 2012-5-10 05:47:38

为什么有些signed char Index; 是3,有些是2呢?
我自己回答:这是因这汉字内码 在后面自动加上一个0*/

tanguicaicai 发表于 2012-5-10 08:58:37

zhwm3064 发表于 2012-5-9 17:46 static/image/common/back.gif
// ------------------汉字字模的数据结构定义 ------------------------ //
flash structtypFNT_GB16...

你的汉字内码什么有3个啊,我的能显示了,还有你那前面用的
flash有什么不同啊

tanguicaicai 发表于 2012-5-10 09:00:06

zhwm3064 发表于 2012-5-10 05:47 static/image/common/back.gif
为什么有些signed char Index; 是3,有些是2呢?
我自己回答:这是因这汉字内码 在后面自动加上一个0*/ ...

不是一个汉字只有两个码吗、什么有3个

tanguicaicai 发表于 2012-5-10 09:05:32

myqiang1990 发表于 2012-5-9 18:05 static/image/common/back.gif
一个汉字两个字节..如果是汉字,在计算机里面就是两个字节的内码...你可以KEIL软仿调试的。。可以看见汉字 ...

听君一言,胜读10年书啊。
谢谢··受教了。

tanguicaicai 发表于 2012-5-10 09:13:29

myqiang1990 发表于 2012-5-9 18:12 static/image/common/back.gif
http://www.ourdev.cn/thread-4099591-1-1.html看我的回复。。。楼主。。。

大虾还有点不明白的地方就是以c1=dp;c2=dp;这只 能查输入一串汉字的第一个字的内码啊。后面的
又什么查·如果是这样uchar i;一个变量,c1=dp;c2=dp;当写完一个字时i++;这我能理解,

zhwm3064 发表于 2012-5-10 21:43:08

tanguicaicai 发表于 2012-5-10 08:58 static/image/common/back.gif
你的汉字内码什么有3个啊,我的能显示了,还有你那前面用的
flash有什么不同啊 ...

可能是编译器不同造成的,在Keil中,可能是两字节
我用的是CVAVR,取两字节会报错,只好用三字节了。是因为在生成的两字节编码的后边。又自动添加了一个0.休止符

zhwm3064 发表于 2012-5-10 21:44:56

tanguicaicai 发表于 2012-5-10 08:58 static/image/common/back.gif
你的汉字内码什么有3个啊,我的能显示了,还有你那前面用的
flash有什么不同啊 ...

我前面用的flash,我不是太清楚了,我想可能是定义 这些数字 存在flash存储器中吧

tanguicaicai 发表于 2012-5-11 09:05:38

昨晚回去搞了一下,出现了一个很怪得现象哦,哪位大虾了解的说一下哦、
display_st1(x,y,*dp,uchar mode);这个函数 是可以写入汉字和字符的(也就调用上面的字模来)
写入一个变量时像uchar c1=4;display_st1(1,1,c1,0);时它显示出现乱码哦display_st1(1,1,“145”,0);它又可以哦

tanguicaicai 发表于 2012-5-12 08:55:44

大家就没有遇到这种情况吗?
display_st1(uchar x,uchar y,uchar *dp,uchar mode);

tanguicaicai 发表于 2012-5-12 08:59:49

大家就没有遇到这种情况吗?
display_st1(uchar x,uchar y,uchar *dp,uchar mode);
写入一个变量就不能正常的显示,固定显示又可以哦,我
搞不清为什么哦,display_st1(1,1,“145”,0);这样又可以,uchar c1=3;
display_st1(1,1,c1,0);当我在前面设定c1=3;时,它又不能
正常显示,郁闷啊

tanguicaicai 发表于 2012-5-12 17:09:35

是不是我问这个问题很菜没人回哦

tanguicaicai 发表于 2012-5-14 14:18:27

木有人回咱了,我改个一个法子让它显示0~9,
void display_shuzi(uchar x, uchar y,uchar a,uchar inverse) 这个是显示数字和变量的
{ uchar k,j;
       for(k=0;k<255;k++)
            { if((a+0x30)>0x39)break;
                          if((a+0x30)== ASC_12.Index )
                             { lcd_address(x,y);
                      for(j=0;j<6;j++)
                      { if(inverse)lcd_data(~ASC_12.Msk);
                     else lcd_data(ASC_12.Msk);}
                  
                            lcd_address(++x,y);
                           for(j=6;j<12;j++)
                              { if(inverse)lcd_data(~ASC_12.Msk);
                         else lcd_data(ASC_12.Msk);}
                                               break;}}
                                                                                                                                                                                                                                        }



void display_st1(uchar x,uchar y,uchar *dp,uchar inverse)
{ uchar c1,c2;
// uint c;
uchar i,j,k,ulen,upage,ucol;
upage=x;
ucol=y;
while ( (uchar)dp != '\0' ){ulen++;};
i=0;
while(i<ulen)
{c1=dp;
   c2=dp;

    if(c1<128)
             {for(k=0;k<255;k++)
            { if(c1== ASC_12.Index ) break;}
                             // if(ucol>128){ucol=1,upage++;}
                  lcd_address(upage,ucol);
                    for(j=0;j<6;j++)
                  { if(inverse)lcd_data(~ASC_12.Msk);
                     else lcd_data(ASC_12.Msk);}
                  
                    lcd_address(++upage,ucol);
                        for(j=6;j<12;j++)
                            { if(inverse)lcd_data(~ASC_12.Msk);
                      else lcd_data(ASC_12.Msk);}
                      upage--;
                                          ucol=ucol+7;
                                          i++;        }

        else       { for(k=0;k<40;k++)
                     {if((c1 == GB_12.Index)&&(c2 == GB_12.Index))
                                            break;}
                     lcd_address(upage,ucol);
                         for(j=0;j<12;j++)
                        { if(inverse)lcd_data(~GB_12.Msk);
                                 else lcd_data(GB_12.Msk);}
                     
                      lcd_address(++upage,ucol);
                            for(j=12;j<24;j++)
                                 { if(inverse)lcd_data(~GB_12.Msk);
                           else lcd_data(GB_12.Msk);}
                                        upage--;
                            ucol=ucol+12;i=i+2;}
                                                                      
                                           }}

byixue 发表于 2014-9-24 10:13:07

路过,学习了

蓝蓝的恋 发表于 2014-10-17 09:27:24

路过,看一下~{:smile:}
页: [1]
查看完整版本: 汉字索引的问题