LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: trotsky

四种拼音输入法的比较以及拼音输入法开发[讨论篇]

[复制链接]
发表于 2003-7-31 16:21:37 | 显示全部楼层
最初由 leafleter 发表
谢谢suzhe大侠的回答!
我现在正在查询scim的相关文档,请问大侠,我要在scim的平台上
开发一个输入法需要做那些工作,或者说scim这个平台为新输入法的开发提供了一些什么帮助?


基于 SCIM 开发输入法其实很简单,基本就只需要实现两个类就行了,一个是 ServerFactory 类,继承自 scim::ServerFactoryBase,一个是 ServerInstance 类, 继承自 scim::ServerInstanceBase。最好的学习办法是看一看 rawcode 输入法模块的源码,或者更复杂的 table 模块的源码。它们在 modules/Server/ 里面。

我这里有一个简单的说明文档,你可以先看一下:

SCIM 设计概要
=============

    SCIM 库是一个通用的输入法开发平台, 可以大大简化输入法的开发难度. 在 SCIM 中, 输入法被分为三大部分: FrontEnd, Server 和 BackEnd. 这三部分的功能是:
    FrontEnd: 负责用户界面的显示, 与客户程序通讯, 将客户程序的按键请求转发给 Server, 执行 Server 发出的各种命令, 如绘制预编辑字符串等等.
    Server:   接收由 FrontEnd 发送的按键事件, 并向 FrontEnd 发送相应的命令, 如显示预编辑字符串, 向客户程序提交字符串等等.
    BackEnd:  管理所有的 Server.

    以上三大部分通过四个虚基类(scimFrontEndBase, scimServerFactoryBase, scimServerInstanceBase, scimBackEndBase)定义了统一的接口, 所有具体实现必须由这些基类派生出来. SCIM 还提供了丰富的工具函数和类, 如负责做编码转换的 scimIConvert 类, 负责管理候选字(词)查找表的 scimLookupTable 类, 读写配置文件的 scimConfigBase 类等等.
    SCIM 的一个显著特点是, FrontEnd, Server, Config 等部分都实现了模块化, 可以通过动态模块来实现具体的功能, 支持不同的系统和环境. 大大增强了 SCIM 的灵活性和可移植性.

    SCIM 的工作原理:
    在 SCIM 中最关键的部分是 FrontEnd 和 Server. 这两部分的实现及其之间的通讯方式是 SCIM 与其它同类平台最不一样的地方. 首先介绍一下 Server 部分的组成. Server 部分分为ServerFactory 和 ServerInstance 两个接口类. 每个输入法服务器都要提供这两个类的具体实现. ServerFactory 负责管理输入法使用的公共数据, 如词库等等, 它还负责创建 ServerInstance 实例. ServerInstance 类负责实际的按键到字符串的转换工作.
    现有输入法开发平台中的 IC (Input Context) 部分其实就是对应 ServerInstance 类. ServerInstance 类就是 IC 的数据与处理函数的封装. 每个 IC 对应一个 ServerInstance 实例. 所有 ServerInstance 实例由 FrontEnd 基类管理. 每个 IC 对应的状态变量, 分为两部分, 其中预编辑字符串等与用户界面无关的数据都保存在 ServerInstance 实例中; 而输入窗口位置等与用户界面相关的数据则由 FrontEnd 派生类负责管理. FrontEnd 的详细内容将在下面介绍.
    下面介绍一下 FrontEnd 和 Server 之间的数据交换和通讯方式. 为了简化编程接口, 在 FrontEnd 和 Server 之间采用了一种松散的接口形式, 即 signal-slot 技术. 首先, 将输入法所需的所有动作以及用户界面中包含的所有基本元素总结归纳出来, 其中, 输入法中所需要的元素包括:
    预编辑字符串 (Preedit String): 用户输入的字符在转换成实际字符串提交给客户程序之前, 将显示在预编辑字符串区域中.
    预编辑光标 (Preedit Caret): 预编辑字符串中的光标, 用户可以利用这个光标对预编辑字符串进行编辑.
    状态字符串 (Status String): 显示输入法服务器当前的状态, 如当前编码, 语言等.
    候选字/词查找表 (Lookup Table): 用户输入的按键与结果字符串可能是一对多的关系, 一个(组)按键对应的所有可能的结果字符串将显示在查找表内, 供用户选择.
    辅助字符串 (Aux String): 输入法可能需要显示某些辅助信息, 可以显示在这个区域.
    另外, 对于亚洲语言来说(尤其是中文), 还需要显示字符和标点(全角/半角)状态.

    由此可以归纳出输入法服务器所需的所有动作:
    * 显示/隐藏/更新 预编辑字符串
    * 更新 预编辑光标
    * 显示/隐藏/更新 状态字符串
    * 显示/隐藏/更新 辅助字符串
    * 显示/隐藏/更新 查找表
    * 向客户程序提交结果字符串
    * 更新字符输入的(全角/半角)状态
    * 更新标点输入的(全角/半角)状态

    而输入法服务器需要处理的事件有:
    * 用户的按键事件
    * 用户选择查找表的事件
    * 用户请求移动预编辑光标的事件
    * 用户请求切换字符和标点输入状态的事件
    * 用户请求切换输入法状态的事件
    * 获得/丢失输入焦点的事件

    为了简化设计, 采用了单向的 signal-slot 结构, 即输入法服务器所需的所有动作都经由signal-slot 发送给 FrontEnd, 而输入法服务器需要处理的事件则直接由 FrontEnd 调用 ServerInstance 类的相应函数来传递.
    所有动作信号的触发与事件函数的调用都封装在 ServerInstance 和 FrontEnd 基类里. 派生类只需要调用基类的相应函数即可, 完全不用关心 FrontEnd 和 ServerInstance 之间的具体通讯方式.

    FrontEnd 的工作机理:
    FrontEnd 除了负责用户界面的绘制, 及与客户程序交互的功能以外, FrontEndBase 基类还负责管理所有 ServerInstance 实例. 每个 ServerInstance 实例都被赋予了一个唯一的 id, FrontEnd 派生类无需直接处理 ServerInstance 实例或者其指针. 所有对 ServerInstance 的操作都由 FrontEndBase 类提供的函数和 ServerInstance 的 id 来完成. 目前 FrontEndBase 类提供以下一些函数来管理 ServerInstance 和 ServerFactory:
   
    * int  get_server_factory_list (vector<int>& ids, vector<scimWideString>& names, const scimString &encoding);
    取得支持特定编码的所有 ServerFactory 的列表. 这个函数主要用于 FrontEnd 派生类显示输入法列表. 每个 ServerFactory 对应一个唯一的 id. 可以用下面的函数选择当前的 ServerFactory.

    * int  new_server_instance (int server_factory_id, const scimString& encoding);
    从特定的 ServerFactory 创建一个支持特定编码的 ServerInstance, 返回这个
    ServerInstance 的 id. FrontEnd 派生类应当保存这个 id,
    以用来和这个 ServerInstance 通讯, 和销毁这个 ServerInstance.

    * bool delete_server_instance (int id);
    销毁一个 ServerInstance.


    * scimWideString get_server_instance_name (int id);
    取得 ServerInstance 的名称, 即输入法的名称.

    * void delete_all_server_instances ();
    销毁所有 ServerInstance.

    以下函数用来和特定的 ServerInstance 通讯:
    * bool process_key_event (int id, scimKeyEvent& key);
    * void reset_server_instance (int id);
    * void focus_in_server_instance (int id);
    * void focus_out_server_instance (int id);
    * void select_lookup_table (int id, unsigned int item);
    * void move_preedit_caret (int id, unsigned int pos);
    * void update_lookup_table_page_size (int id, unsigned int page_size);
    * void toggle_full_width_punctuation (int id);
    * void toggle_full_width_letter (int id);
    * void toggle_input_status (int id);

    FrontEnd 派生类通过继承 FrontEndBase 提供的一系列纯虚函数来处理 ServerInstance 发出的动作请求. 这些接口函数有:

    virtual void show_preedit_string (int id) = 0;
    virtual void show_status_string  (int id) = 0;
    virtual void show_aux_string     (int id) = 0;
    virtual void show_lookup_table   (int id) = 0;
    virtual void hide_preedit_string (int id) = 0;
    virtual void hide_status_string  (int id) = 0;
    virtual void hide_aux_string     (int id) = 0;
    virtual void hide_lookup_table   (int id) = 0;
    virtual void update_preedit_caret  (int id, int caret) = 0;
    virtual void update_status_string  (int id, const scimWideString & str) = 0;
    virtual void update_aux_string     (int id, const scimWideString & str) = 0;
    virtual void update_lookup_table   (int id, const scimLookupTable & table) = 0;
    virtual void commit_string         (int id, const scimWideString & str) = 0;
    virtual void forward_keypress      (int id, const scimKeyEvent & key) = 0;
    virtual void update_full_width_punctuation (int id, bool full) = 0;
    virtual void update_full_width_letter      (int id, bool full) = 0;
    这些函数由 FrontEndBase 类调用. 参数 id 为发出动作请求的 ServerInstance 的 id.
发表于 2003-7-31 16:24:26 | 显示全部楼层
最初由 leafleter 发表
suzhe大侠,那里有比较详细的scim开发文档,用google搜不到啊!


SCIM 目前还没有非常详细的文档。你如果有兴趣的话,欢迎加入SCIM 的开发队伍,帮助编写文档。
发表于 2003-9-5 02:41:05 | 显示全部楼层
最初由 trotsky 发表
当然,我也知道这一点,但是这只是一个小小的遗憾。
微软拼音是在所有拼音输入法中最强的,这不容否认,其次是苏哲的scim。


我倒不觉得微软的拼音输入法是最强的我喜欢智能abc
发表于 2003-9-7 18:59:10 | 显示全部楼层
切,看到最后还是比较遗憾,还是各自为政:mad:
发表于 2004-1-24 16:34:54 | 显示全部楼层
我make install 之后显示xmodifiers没有设置, 怎么回事儿啊?
发表于 2004-1-24 22:40:52 | 显示全部楼层
最初由 oar 发表
切,看到最后还是比较遗憾,还是各自为政:mad:


他們只是使用不同的xim開發套件吧...
如果有一個完善的開發套件...我想..各自為政的現像會少點


不過我還是支持fcitx
ho..因為我只用五筆.....fcitx當初就是為開發五筆而?淼
希望作者..能把五筆寫得更好....暫時不要向其它方面發展.

拼音那些還是等五筆輸入真的完善了..才考慮吧
個人建議而已
发表于 2004-1-25 21:43:24 | 显示全部楼层
晚些时候给fcitx提具体建议。
很好对输入法了。:)
发表于 2004-1-25 21:51:40 | 显示全部楼层
scim没有用过呢,晚些试试。
开发我有心无力。呵呵。我只会用Smalltlk
发表于 2004-1-31 19:05:47 | 显示全部楼层

呵呵,看到这里讨论原来这么热烈

从头看到尾,觉得有点意思。
说一个不相关的个人看法:

windows下的输入法用过的有智能狂拼,黑马,微软拼音,智能abc,紫光。
linux下用过chinput,fcitx。

呵呵,没用过scim。//shy

我觉得输入法的设计者可以看看这几种输入法各自的优缺点。

如果说词库和联想功能,还有句子输入,我认为最强的是智能狂拼。他的词库变态的大,而且能够在输入的时候同时候选句子和词组。本科宿舍的同学一致认为如果你打算写长篇大论>1万字,这个是首选。缺点是太耗资源,变态的大。

微软拼音和紫光水平很接近,但紫光人机界面做得很好联想功能也很强,并且词组很符合中国人习惯。我认为他在消耗资源和功能上的折衷做的最好。微软拼音很不错,可用了紫光以后就不想用他了。开始的主要原因是紫光的 "." 翻页和回车英文真的是设计的非常好,很handy。很多时候一个小功能就会抓住用户,就好象opera的鼠标动作。不过感觉紫光比较适合聊天用,呵呵。

综合考虑,我觉得最“好”的是紫光,联想功能和微软拼音接近,但操作很方便。

毕业论文是用fcitx写的,喜欢fcitx的原因是因为他的默认操作和紫光一样,不用配置,估计是借鉴了吧,呵呵。至于联想等和紫光还是有一定差距的。
发表于 2004-1-31 19:10:25 | 显示全部楼层

呵呵

最初由 ida 发表
我倒不觉得微软的拼音输入法是最强的我喜欢智能abc


建议你用用紫光,如果你还用windows,不会让你后悔的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表