免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 759 | 回复: 0
打印 上一主题 下一主题

在Linux下添加炎黄中文输入法平台 [复制链接]

论坛徽章:
1
15-16赛季CBA联赛之北控
日期:2022-03-04 22:35:50
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-23 14:00 |只看该作者 |倒序浏览

出处:红旗Linux 

阅读提示:在炎黄中文平台上,用户可以自行添加输入法。炎黄中文平台的输入部分的程序设计使用了一个主导模块作为和平台的接口,它和各输入法模块之间采用统一的、规范的界面。各个输入法可看作是一个个过滤,输入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  1)
qv = (extcode[0] - '0') * 10 + (extcode[1] - '0');
else if (extcode[0] == '0')
qv = 1;
else
qv = (extcode[0] - '0') * 10;
wei = (eclen  0) && (w

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/31/showart_573904.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP