要实现简单功能的拼音输入法其实很简单,只是一个查询的过程。
类型定义:
typedef signed char INT8;
typedef signed int INT16;
typedef signed long INT32;
typedef unsigned char UINT8;
typedef unsigned int UINT16;
typedef unsigned long UINT32;
以下列举所有的拼音组合,要注意的是该组合来自网络,仅仅包含
GB2313编码,如果是GBK编码就要自行增加很多汉字了。
//拼音对应汉字排列表
unsigned char code PY_mb_a []={"阿啊"};
unsigned char code PY_mb_ai []={"哎哀唉埃挨皑癌矮蔼艾爱隘碍"};
unsigned char code PY_mb_an []={"安氨鞍俺岸按案胺暗"};
..................
unsigned char code PY_mb_zun []={"尊遵"};
unsigned char code PY_mb_zuo []={"昨左佐作坐座做"};
typedef struct
{
UINT8 PY_List[8]; /////拼音字串,最大7个拼音字母+1个结束标志
UINT8 * PY_addr; /////对应的汉字数组指针
}_PY_Struct;
以下是列举所有GB2313拼音与汉字对应映射,按英文字母顺序排列,所有英文为小写,大写E表示数组结束:
_PY_Struct code PY_index_a[]=
{
{" ",PY_mb_a},
{"i ",PY_mb_ai},
{"n ",PY_mb_an},
{"ng ",PY_mb_ang},
{"o ",PY_mb_ao},
{"E ",0xffff} //end of array
};
_PY_Struct code PY_index_b[]=
{
{"a ",PY_mb_ba},
{"ai ",PY_mb_bai},
{"an ",PY_mb_ban},
{"ang ",PY_mb_bang},
{"ao ",PY_mb_bao},
{"ei ",PY_mb_bei},
{"en ",PY_mb_ben},
{"eng ",PY_mb_beng},
{"i ",PY_mb_bi},
{"ian ",PY_mb_bian},
{"iao ",PY_mb_biao},
{"ie ",PY_mb_bie},
{"in ",PY_mb_bin},
{"ing ",PY_mb_bing},
{"o ",PY_mb_bo},
{"u ",PY_mb_bu},
{"E ",0xffff} //end of array
};
..............................
_PY_Struct code PY_index_z[]=
{
{"a ",PY_mb_za},
{"ai ",PY_mb_zai},
{"an ",PY_mb_zan},
{"ang ",PY_mb_zang},
{"ao ",PY_mb_zao},
{"e ",PY_mb_ze},
{"ei ",PY_mb_zei},
{"en ",PY_mb_zen},
{"eng ",PY_mb_zeng},
{"ha ",PY_mb_zha},
{"hai ",PY_mb_zhai},
{"han ",PY_mb_zhan},
{"hang ",PY_mb_zhang},
{"hao ",PY_mb_zhao},
{"he ",PY_mb_zhe},
{"hen ",PY_mb_zhen},
{"heng ",PY_mb_zheng},
{"hi ",PY_mb_zhi},
{"hong ",PY_mb_zhong},
{"hou ",PY_mb_zhou},
{"hu ",PY_mb_zhu},
{"hua ",PY_mb_zhua},
{"huai ",PY_mb_zhuai},
{"huan ",PY_mb_zhuan},
{"huang ",PY_mb_zhuang},
{"hui ",PY_mb_zhui},
{"hun ",PY_mb_zhun},
{"huo ",PY_mb_zhuo},
{"i ",PY_mb_zhi},
{"ong ",PY_mb_zhong},
{"ou ",PY_mb_zhou},
{"u ",PY_mb_zu},
{"uan ",PY_mb_zuan},
{"ui ",PY_mb_zui},
{"un ",PY_mb_zun},
{"uo ",PY_mb_zuo},
{"E ",0xffff} //end of array
};
以下是26个英文字母对应的数组,根据拼音字符串的首字母查找相应的拼音组合:
_PY_Struct * PY_index_pointer[26]=
{
PY_index_a,PY_index_b,PY_index_c,PY_index_d,PY_index_e,PY_index_f,PY_index_g,PY_index_h,
PY_index_j,PY_index_j,PY_index_k,PY_index_l,PY_index_m,PY_index_n,PY_index_o,PY_index_p,
PY_index_q,PY_index_r,PY_index_s,PY_index_t,PY_index_w,PY_index_w,PY_index_w,PY_index_x,
PY_index_y,PY_index_z
};
demo函数如下:
#include "pinying.h"
/***************************************************
输入参数:
UINT8 *PY_Str --- 拼音字母字符串,必须为小写,
如不是请自行转换。最大7个字母
输出参数:
GB2313编码的汉字字串。
****************************************************/
UINT8* PY_Search(UINT8 *PY_Str)
{
data UINT8 i,j,k,ii;
_PY_Struct * pPY_temp1;
k = PY_Str[0] -'a'; //////所有拼音字母为小写
{
pPY_temp1 = PY_index_pointer[k];
while( 1 )
{
if(pPY_temp1->PY_List[0] == 'E') break;
for( j=0;j<7;j++ ) ////最大7个拼音字母
{
if( (PY_Str[j+1] == ' ') || (PY_Str[j+1] == '\0') )
{
return (pPY_temp1->PY_addr);
//bSearchOk = 1;
// break;
}
if( PY_Str[j+1] != pPY_temp1->PY_List[j] )
{
break;
}
}
pPY_temp1 ++;
}
}
return 0xffff;
}
完整的GB2313 拼音文件:
pinying.rar