| 网站首页 | 硬件维修 | 应用学院 | 网络组建 | 网站制作 | 菜鸟黑客 | 编程之道 | 数码大全 | 娱乐休闲 | 软件下载 | 在线视频 | 请您留言 | 技术论坛 | 
专 题 栏 目
最 新 热 门
最 新 推 荐
相 关 文 章
  • 无须装输入法也可以输入汉字

  • 让Google Deskbar实现简体中…

  • 实现了!中文WinXP安装IE7 B…

  • 腾讯TT浏览器V2.03简体中文版

  • QQ2005Beta3与输入法组件冲突…

  • 快速添加成员、保护群隐私

  • 抹去QQ消息中自动添加的时间…

  • 轻松在QQ中输入繁体字

  • 将浏览的网页添加到自定义面…

  • 将网页上的图片添加到QQ表情

  • Q
    您现在的位置: 我是IT人 >> 应用学院 >> 操作系统 >> Linux >> 教程正文
    炎黄中文平台的输入法添加           
    炎黄中文平台的输入法添加
    作者:网络 文章来源:转载 点击数: 更新时间:2005-8-15
    [ 字体:缩小 正常 放大 | 双击自动滚屏 ]
    请选择合适的字体颜色:

    在炎黄中文平台上,用户可以自行添加输入法。炎黄中文平台的输入部分的程序设计使用了一个主导模块作为和平台的接口,它和各输入法模块之间采用统一的、规范的界面。各个输入法可看作是一个个过滤,输入ASCII码,返回得到的汉字。

    输入法的主导模块以动态连接库(libimpi.a)的形式存在,和各输入法模块连接成单独的可执行文件。模块层次如下图:




    对于每一个具体的输入法,只需要按照一定的数据结构就可以链接成为新的可执行文件,并且添加到炎黄中文平台上。这些数据结构包括外部变量和外部函数。

    1、外部变量

    数组extcode[]:字符串类型,表示输入的外码串;

    数组candstr[]:字符串类型,表示重码的待选串;

    数组result[]:字符串类型,表示得到的结果串;

    数组imname[]:字符串类型,表示输入法的名称;

    数组imdscrpt[]:字符串类型,表示对输入法的描述。

    变量maxeclen:整型,表示外码的最大长度;

    变量eclen:整型,表示外码的长度。

    这些变量的定义如下所示:

    extern int maxeclen; /* The maximum length of external code */
    extern int eclen; /* The length of external code */
    extern char extcode[]; /* External code */
    extern char candstr[]; /* Candinate string */
    extern char result[]; /* Result string */

    2、外部函数

    外部函数一共有四个,它们分别是IMInit()、IMCleanup()、IMSelect()和IMFilter()。这四个函数的定义分别如下所示:

    int IMInit();
    int IMClearup();
    int IMSelect(int select);
    int IMFilter(int ch);

    其中IMInit()函数用来完成输入法的初始化工作;IMClearup()函数用来对输入法被释放时的情况进行处理; IMSelect()函数用来处理当前输入法被选中的情况;IMFilter()是输入法的核心函数,用来对接收的字符串进行过滤,得到正确的输入结果。

    下面以区位输入法为例对此进行简单的介绍:

    准备工作
    首先需要取得libimpi.a文件,然后可以创建一个qvwei目录。

    代码编写
    编译一个qvwei.c文件,接着对输入法进行初始化,这时候的qvwei.c如下所示。

    /* The qvwei input method

    */

    #include
    #include
    #include
    #include
    #include "impi.h"



    char imname[] = "区位";
    char imdscrpt[] = "区位输入法";


    static void reset();
    static void append(int ch);
    static void comp_appe(int prevch, int ch);

    int IMInit()
    {
    return 0;
    }

    int IMClearup()
    {
    return 0;
    }

    int IMSelect(select)

    int select;
    {
    return 0;
    }



    int IMFilter(ch)

    int ch;
    {

    }

    接下来的工作就是编写IMInit()、IMClearup()、IMSelect()和IMFilter()这四个函数了。

    在IMInit()函数中添加如下的代码:

    maxeclen = 5;
    reset();
    return 0;

    由于区位输入法比较简单,IMClearup()和IMSelect()函数都不需要额外添加代码,在IMFilter()这个函数中加入如下的处理代码:

    candstr[0] = '\0';
    result[0] = '\0';



    /* process currnet keystroke */

    if (isdigit(ch))
    {

    if ((eclen == 1) || (eclen == 3))
    comp_appe(extcode[eclen - 1], ch);
    else
    append(ch);

    if (eclen == 4)
    {
    int qv, wei;

    qv = (extcode[0] - '0') * 10 + (extcode[1] - '0');
    wei = (extcode[2] - '0') * 10 + (extcode[3] - '0');

    reset();

    result[0] = qv + 0xa0;
    result[1] = wei + 0xa0;
    result[2] = '\0';

    }

    }

    else
    {

    if ((ch == KEY_BACKSPACE) && (eclen > 0))
    extcode[--eclen] = '\0';
    else
    {
    result[0] = ch;
    result[1] = '\0';
    }

    }

    /* generate candinates */

    if ((eclen > 0) && (eclen < 4))
    {

    int qv, wei, i, w;
    char buf[3];
    char *p;



    if (eclen > 1)
    qv = (extcode[0] - '0') * 10 + (extcode[1] - '0');
    else if (extcode[0] == '0')
    qv = 1;
    else
    qv = (extcode[0] - '0') * 10;

    wei = (eclen < 3) ? 0 : (extcode[2] - '0') * 10;

    p = candstr;

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

    {
    w = wei + i;
    if ((w > 0) && (w <= 94))
    {

    buf[0] = qv + 0xa0;
    buf[1] = wei + i + 0xa0;
    buf[2] = '\0';

    p += sprintf(p, " %d: %s", i, buf);

    }

    }

    }

    return 0;

    上面的代码中用到了另外三个函数,这三个函数可以定义为局部函数,它们的实现代码如下所示:

    static void reset(void)

    {

    eclen = 0;
    extcode[0] = '\0';
    candstr[0] = '\0';
    result[0] = '\0';

    }

    static void append(ch)
    int ch;

    {

    extcode[eclen++] = ch;
    extcode[eclen] = '\0';

    }

    static void comp_appe(prevch, ch)
    int prevch;
    int ch;

    {

    if (prevch == '0')

    [1] [2] 下一页  

    教程录入:小秦    责任编辑:小秦 
  • 上一篇教程:

  • 下一篇教程:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    | 设为首页 | 加入收藏 | 联系站长 | 关于我们 | 友情链接 | 版权申明 |