分享
 
 
 

Linux中文化之炎黄中文平台的输入法添加

王朝system·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

在炎黄中文平台上,用户可以自行添加输入法。炎黄中文平台的输入部分的程序设计使用了一个主导模块作为和平台的接口,它和各输入法模块之间采用统一的、规范的界面。各个输入法可看作是一个个过滤,输入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

{

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

p = candstr;

for (i = 0; i

{

w = wei + i;

if ((w 0) && (w

{

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')

{

if (ch != '0')

append(ch);

}

else if (prevch == '9')

{

if (ch

append(ch);

}

else

append(ch);

}

把上面的代码拼接起来,就是一个完整的qvwei.c文件。

编译和链接

最后可以编写一个MakeFile来创建可执行的输入法文件。一个Makefile的例子如下所示:

qvwei:

cc ?c qvwei.c

cc ?o $@ qvwei.o libimpi.a

strip $@

rm ?f *.o

然后只需要在这个目录下键入make,就可以创建一个可执行的qvwei文件。在运行炎黄中文平台之后运行这个qvwei文件,就可以把这个输入法添加到炎黄中文平台中,平台会自动给这个输入法分配切换快捷键。

注意事项:

1:随同打包的还有四个文件,它们分别是impi.c、impi.h、incommon.c和imcommon.h,它们的作用是用来生成libimpi.a。提供这四个函数源代码的用意是方便用户对输入法的理解。但是绝对不要改变这四个文件并且重新编译libimi.a,否则炎黄中文平台有可能无法识别新生成的输入法。

2:以上只是一个简单的示例,针对不同的输入法类型,输入法的核心代码可能要复杂得多。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有