庞大资源库的计算机教程网站!
设为首页
加入收藏
总编信箱
投稿或申请专栏请先 [登 陆]
首页 操作系统 程序设计 图形图像 媒体动画 机械电子 WEB开发 数 据 库 办公系列 路由技术 网络原理 网络应用
认证考试 安全技术
首页>操作系统>Linux>中文化>正文
资料搜索
Google搜索
Google
返回上级列表

推荐文章

快速保存网页中所有图片的方法
Windows中让光驱巧妙“隐身”技
防范非法用户入侵Win 2000/XP系
两款比较典型的ASP木马防范方法
有关表格边框的css语法整理
Windows XP中可以被禁用的服务
SQL Server导出导入数据方法
Javascript所有对象的属性的获
网页(HTML)中的特殊字符
与篮球共舞,尽显模式本色
QQ病毒的手工清除方法
Photoshop为极品美女打造性感睫
天衣无缝:IIS与PHP水火也相容
SQL Server存储过程编写和优化

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

 作者:本站收集   日期:2005-4-16
字号选择〖 〗/ 双击滚屏 单击停止   
在炎黄中文平台上,用户可以自行添加输入法。炎黄中文平台的输入部分的程序设计使用了一个主导模块作为和平台的接口,它和各输入法模块之间采用统一的、规范的界面。各个输入法可看作是一个个过滤,输入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')

{

if (ch != '0')

append(ch);

}

else if (prevch == '9')

{

if (ch <= '4')
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:以上只是一个简单的示例,针对不同的输入法类型,输入法的核心代码可能要复杂得多。
上一篇:LINUX 终端国际化解决方案    下一篇:Unicon安装流程  
[发送给好友]  [关闭窗口]  [返回顶部]   转载请注明来源:www.it00.com   
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
责任编辑: 原点 投稿作者: 本站收集
信息来源: 网络 录入时间: 2005-4-16
关于我们 - 广告服务 - 版权申明 - 网站地图 - 联系方式 - 总编信箱 - 会员投稿