一种利用XENIX & OCI_C的拼音编码自动化的方法


 

 

  一种利用XENIX & OCI_C的拼音编码自动化的方法

 

   中国人民银行保山地区分行 周易达 陈春江

   (邮编:678000 电话:0875 2120415)

 

  在多用户程序设计过程中,有时为了查找方便,常常使用汉字的拼音编码,为了使拼音编码正确、唯一,拼音编码过程必须自动化。在标准字库中,一级汉字按音序排列,因此,一级汉字的拼音编码,可以利用23个声母对应的最前一个汉字,通过比较大小计算出来;但是,二级汉字是按笔画顺序排列的,所以其大小与音序不一致;为此,必须建立一个二级汉字(3008个)拼音编码对照表。利用DOS中LX-OA提供的字典还原功能可得到区位码字库文本和拼音码字库文本。在区位码字库文本中,从5601~8794区位号对应的汉字即为二级汉字,再根据二级汉字在拼音字库文本中查找拼音编码声母,这样,可用一个程序自动实现建库过程。下面的子程序可实现拼音编码自动化。

 

#include <curses.h>

#include "csrdef.h"

main()

{

 int ret;

 char str[20],pybm[12];

 olon(&lda,"zhgl/zhgl",-1,(char*)0,-1,0); /*ORACLE注册*/

 initscr();                /*初始化屏幕*/

 for(;;)

 {ret=input_str(stdscr,10,10,18,str,1); /*输入汉字串*/

  if(ret==27||ret==-1) break;

  zydpybm(str,pybm);           /*调转换程序*/

  mvprintw(11,10,pybm); refresh(); getch(); }

 endwin();                /*关闭curses屏幕*/

 ologof(&lda);              /*ORACLE注消*/

}

 

/*把字符串按音序编码*/

zydpybm(str,bm)

 char str[],bm[];

{

 int i,k,len;

 char c[106],c1[3],c2[3],z[54],m[2],op[300];

 strcpy(c,"啊芭擦搭蛾发噶哈击喀垃妈拿哦啪期然撒塌挖昔压匝");

 strcpy(z,"abcdefghjklmnopqrstwxyz");

 len=strlen(str)/2;

 strcpy(bm,"");

 for(i=0;i<len;i++)

 {

  c1[0]=str[2*i]; c1[1]=str[2*i+1];c1[2]='\0';

  if(strcmp(c1,"")>0)         /*如果二级汉字*/

   {

   if(che_table("pyzk")<1)     

    { /*如果拼音字库表不存在,则创建之。*/

     sprintf(op,"create table pyzk(py char(1),hz char(2))");

     /*执行ORACLE语句*/

     oopen(&cur,&lda,(char*)0,-1,-1,(char*)0,-1);

     osql3(&cur,op,-1);

     oexec(&cur);

     ocom(&lda);

     oclose(&cur);

    }

   strcpy(m,"");

   sprintf(op,"select py from pyzk where hz='%s'",c1);

   /*从ORACLE表中取拼音编码*/

   oopen(&cur,&lda,(char*)0,-1,-1,(char*)0,-1);

   osql3(&cur,op,-1);

   odefin(&cur,1,m,3,5,-1,(short *)0,(char*)0,-1,-1,(short*)0,(short*)0);

   oexec(&cur);

   strcpy(chr,"");

   ofetch(&cur);

   oclose(&cur);

   if(strlen(m)<1)

    {/*如果取不到,则建拼音字库*/

     mvprintw(20,0,"请输入[%s]字的拼音编码:",c1);

     inm:

     input_str(stdscr,20,26,1,m,1);

     if(strlen(trim(m))<1) goto inm;

     sprintf(op,"insert into pyzk(py,hz) values('%s','%s')",m,c1);

     /*执行ORACLE语句*/

     oopen(&cur,&lda,(char*)0,-1,-1,(char*)0,-1);

     osql3(&cur,op,-1);

     oexec(&cur);

     ocom(&lda);

     oclose(&cur);

    }

   }

  else

   {

   for(k=0;k<23;k++)

    {

     c2[0]=c[2*k]; c2[1]=c[2*k+1]; c2[2]='\0';

     if(strcmp(c1,c2)==0) break;

     else if(strcmp(c1,c2)<0) {k=(k>0)?k-1:k;break;}

    }

   k=k>22?22:k;

   m[0]=z[k];

   m[1]='\0';

   }

  strcat(bm,m);

 }

}