白菜工场 https://bbs.21ic.com/?683635 [收藏] [复制] [RSS]

日志

基于C51的拼音输入法

已有 928 次阅读2011-3-2 15:02 |系统分类:单片机| C51, 拼音输入法

要实现简单功能的拼音输入法其实很简单,只是一个查询的过程。

类型定义:
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

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)