易码技术论坛

 找回密码
 加入易码
搜索
查看: 1736|回复: 13

[源码] 一个不成熟的全平台拼音输入函数(封装)

[复制链接]
发表于 2008-2-2 16:24:55 | 显示全部楼层 |阅读模式
这是在前人的基础上写的一个不成熟全平台的拼音输入函数,调用input之后,返回的汉字在data中,要输入字串,可以自己写一个
用前确保LavaData目录下有pinyin.dic文件
  1. //#define USE_QUEWEI
  2. //#define USE_EXTRA
  3. #define PY_MAX        9
  4. #define NULLCHAR 0

  5. #define F2_KEY      0x1d
  6. #define UP_KEY            0x14
  7. #define        DOWN_KEY    0x15
  8. #define LEFT_KEY    0x17
  9. #define RIGHT_KEY   0x16
  10. #define CR_KEY             0x0d

  11. int  Py_begin0,Py_begin1;
  12. int  Py_len[3];
  13. char Fp_py2gb;
  14. char Table_py[69],Table_sm[24],Table_ym[133];



  15. void PY2GB_Init()
  16. {  char ver[5];
  17.    Fp_py2gb= fopen("/LavaData/pinyin.dic","r");
  18.    if(Fp_py2gb==0)
  19.    Fp_py2gb= fopen("/GVMData/pinyin.dic","r");
  20.    fseek(Fp_py2gb,32,0);
  21.    fread(ver,1,4,Fp_py2gb);
  22.    if(strcmp(ver,"1.00")!=0)
  23.    {  SetScreen(1);
  24.       printf("Version %s\nError Version!!\n",ver);
  25.       getchar();
  26.       exit(0);
  27.    }
  28.    fseek(Fp_py2gb,50,0);
  29.    fread(Py_len,1,6,Fp_py2gb);
  30.    fread(Table_py,1,Py_len[0]+1,Fp_py2gb);
  31.    fread(Table_sm,1,Py_len[1]+1,Fp_py2gb);
  32.    fread(Table_ym,1,Py_len[2]+1,Fp_py2gb);
  33.    Py_begin0=ftell(Fp_py2gb);
  34.    Py_begin1=Py_begin0+Py_len[0];
  35. }

  36. void PY2GB_End()
  37. {
  38.    fclose(Fp_py2gb);
  39. }

  40. int System_QW2GB(long qwc,long buf)
  41. {
  42.    char gb[4];
  43.    if(strlen(qwc)!=4)
  44.       return -1;
  45.    gb[0]=*(qwc+0)*10+ *(qwc+1)- 368;
  46.    gb[1]=*(qwc+2)*10+ *(qwc+3)- 368;
  47.    gb[2]=NULLCHAR;
  48.    if(gb[0]>160&&gb[1]>160)
  49.       strcpy(buf,gb);
  50.    else
  51.       return -1;
  52.    return gb[0]+(gb[1]<<8);
  53. }

  54. long System_PY2GB(int id,long pys,long buf)
  55. {
  56.    int n0,n1,n2;
  57.    int max,pos,num,len;
  58. //   *buf=NULLCHAR;
  59.    len=strlen(pys);
  60.    if(id<0||len<=0||len>6) return -1;
  61. /*
  62. #ifdef USE_QUEWEI
  63.    if(*pys=='v')
  64.    {  if(System_QW2GB(pys+1,buf)==-1)
  65.          return -1;
  66.       else
  67.          return 0x00010001;
  68.    }
  69. #endif
  70. #ifdef USE_EXTRA
  71.    if(*pys=='u')
  72.    {  if(len==2)
  73.          num=*(pys+1);
  74.       else
  75.       if(len==3 && *(pys+1)=='u')
  76.          num=*(pys+2);
  77.       else
  78.          return -1;
  79.       if(num>='a' && num<='z')
  80.       {  *buf=163;
  81.          *(buf+1)=32+len*32+num;
  82.       }
  83.       else
  84.       if(num>='1' && num<='9')
  85.       {  *buf=162;
  86.          *(buf+1)=24+len*52+num;
  87.       }
  88.       else
  89.          return -1;
  90.       *(buf+2)=NULLCHAR;
  91.       return 0x00010001;
  92.    }
  93. #endif
  94. */
  95.    n0=strstr(Table_py,pys);
  96.    if(n0!=0)
  97.       pos=Py_begin0+(n0-Table_py);
  98.    else
  99.    {  n1=strchr(Table_sm,*pys);
  100.       if(n1==0) return -1;//声母不存在
  101.       pys++;
  102.       if(*pys==0) return -1;
  103.       else
  104.       if(*pys=='h') { pys++; n1++; }
  105.       n2=strstr(Table_ym,pys);
  106.       if(n2==0) return -1;//韵母不存在
  107.       pos=Py_begin1+(n1-Table_sm)*Py_len[2]+(n2-Table_ym);
  108.    }
  109.    fseek(Fp_py2gb,pos,0);
  110.    fread(&max,1,2,Fp_py2gb);
  111.    if(max==-1||max<=id) return -1;
  112.    fread(&pos,1,2,Fp_py2gb);
  113.    num = max-id;
  114.    if(num>PY_MAX) num=PY_MAX;
  115.    fseek(Fp_py2gb,pos+id*2,0);
  116.    fread(buf,1,num*2,Fp_py2gb);
  117.    *(buf+num*2) = NULLCHAR;
  118.    return num+(max<<16);
  119. }

  120. //hanzi[3]用于存放中文变量
  121. void input(char &hanzi[])
  122. {
  123. char i;//标志输入了几个拼音字母
  124. char group;//第几组
  125. char present;//光标在第几个
  126. long n;//py2gb返回值
  127. char sum;//总汉字数
  128. char key;//按键
  129. char str[7];//拼音缓存
  130. char buf[10][2];//字符缓存
  131. int result;

  132. present=4;
  133. group=0;

  134. PY2GB_Init(); // 放在首次使用System_PY2GB前
  135. TextOut(2,68,"拼",65);Box(2,66,14,80,1,2);
  136. for(i=0;;)
  137. {
  138. key=getchar();
  139. if(islower(key))
  140. {
  141.   if(i<6){str[i]=key;group=0;}
  142.   str[++i]=0;
  143.   memset(buf,' ',18);
  144.   TextOut(52,68,buf,65);
  145.   n=System_PY2GB(group*9,str,buf);
  146.   present=(n&0xffff)/2;

  147. }
  148. else if(key==F2_KEY)
  149. {
  150. if(i>0)str[--i]=0;
  151. memset(buf,' ',18);
  152. TextOut(52,68,buf,65);
  153. n=System_PY2GB(group*9,str,buf);
  154. present=(n&0xffff)/2;

  155. }
  156. else if(key==LEFT_KEY)
  157. {
  158. if(present>0)present--;
  159. }
  160. else if(key==RIGHT_KEY)
  161. {
  162. if(present<(n&0xffff-1))present++;
  163. }
  164. else if(key==UP_KEY)
  165. {
  166. if(group>0)group--;
  167. memset(buf,' ',18);
  168. TextOut(52,68,buf,65);
  169. n=System_PY2GB(group*9,str,buf);
  170. present=(n&0xffff)/2;

  171. }
  172. else if(key==DOWN_KEY)
  173. {
  174. if(sum>((group+1)*9)){group++;}
  175. memset(buf,' ',18);
  176. TextOut(52,68,buf,65);
  177. n=System_PY2GB(group*9,str,buf);
  178. present=(n&0xffff)/2;

  179. }
  180. else if(key==CR_KEY)
  181. {
  182. memcpy(hanzi,buf[present],2);
  183. return;
  184. }

  185. str[i]=0;
  186. sum=n>>16;
  187. TextOut(15,67,"      ",65);
  188. TextOut(15,68,str,65);        //输出拼音
  189. TextOut(52,68,buf,65);        //输出备选汉字
  190. if(n==-1)continue;
  191. Box(52+12*present,68,63+12*present,80,1,2);
  192. }

  193. PY2GB_End();// 放在不再需要System_PY2GB后
  194. }


  195. void main()
  196. {
  197. char data[3];
  198. input(data);
  199. printf("%s",data);
  200. }
复制代码

py.rar

16.83 KB, 下载次数: 294

发表于 2008-2-2 17:32:32 | 显示全部楼层
非常感谢!
收下了先!
发表于 2008-2-2 20:21:55 | 显示全部楼层
只用过星星之火提供的拼音输入法,呵呵~~~
发表于 2008-2-3 00:32:34 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2008-2-3 10:13:39 | 显示全部楼层
怎么看源代码怎么像是我当初写的那个....
当初做的还有五笔的说,不过是另外发表的...
我还没死,怎么就成前人了....
发表于 2008-2-3 13:51:31 | 显示全部楼层
输入法的联想功能需要的数据,不知道谁能提供一下
发表于 2008-2-3 14:14:51 | 显示全部楼层
原帖由 诗诺比 于 2008-2-3 10:13 发表
怎么看源代码怎么像是我当初写的那个....
当初做的还有五笔的说,不过是另外发表的...
我还没死,怎么就成前人了....

嘿嘿,潜水太久就会变死人的……只有偶们这些 NET 的老迷们才记得你这个人咯!~~~
发表于 2008-2-3 16:27:12 | 显示全部楼层
不错,正想找呢~~
嘿嘿,送上门来了~~
发表于 2008-2-3 16:27:33 | 显示全部楼层
原帖由 Isword 于 2008-2-3 13:51 发表
输入法的联想功能需要的数据,不知道谁能提供一下

我这有个联想的数据,怎么给你呢?
发表于 2008-2-3 18:09:59 | 显示全部楼层
加一下俺的QQ吧,532451538
先谢谢了
发表于 2008-2-4 09:35:54 | 显示全部楼层
已加LS的QQ。我常年隐身....
发表于 2008-2-4 10:41:07 | 显示全部楼层
非常感谢 诗诺比提供的联想数据
发表于 2008-2-5 21:49:59 | 显示全部楼层
看了LZ的代码,感觉很多代码都是废的,还有不少错误的地方
比如:函数int System_QW2GB(long qwc,long buf);根本就没有用到
还有开头验证本版号的那段也是废代码
TextOut(15,67,"      ",65);这句应该改为:TextOut(15,68,"      ",65);
发表于 2008-2-14 11:11:56 | 显示全部楼层
System_QW2GB
是区位码转GB码,我只是提供,LZ没加进去也没去掉,和我做它的目的无关,
验证本版号并非废代码,只不过是我做出了1.00词库后就没有更新...
我的更新不向下兼容....
==========
至于TextOut,那不是我写的....
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-4-23 17:11 , Processed in 0.012522 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表