一种利用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);
}
}