什么是输入法?

来源:互联网 发布:js 地球3d旋转动画 编辑:程序博客网 时间:2024/05/01 13:30

什么是输入法?

输入法从底层到上层可以简单的分为三类:

  • 输入法框架
  • 输入法引擎
  • 输入法界面

因此,和最终用户和半瓶水的开发者讨论输入法是非常困难的,大部分时候都是鸡同鸭讲。最终用户对输入法的认识大部分停留在输入法界面的层面上,也就是诸如搜狗输入法换皮肤这个境界,而半瓶水的开发者可能认识到了“壁纸不是桌面环境”这个命题,但是他们的认识大部分停留在输入法引擎的层面上(包括大多数 Linux 核心项目的老外开发者,比如 GNOME),他们会认为 sunpinyin 好就代表 fcitx 好,或者 googlepinyin/五笔好就代表 ibus 好这样的层面。

因此请注意下文中的输入法,输入法框架,输入法引擎,输入法界面这样的词,它们说的都是不同的东西。

输入法框架

输入法框架是作为处理输入法引擎处理后的用户输入数据与最终要显示输入结果的图形/命令行环境比如 X11/Console,不同桌面环境比如 GNOME/KDE,以及各类应用程序间的通信的中心而存在的。常见的输入法框架有苏哲先生的 scim,黄鹏先生、日本人 Takao Fujiwara 的 ibus 以及 22 岁的开发者翁学天(老 K,KDE 的 K)的 fcitx(最早是鱼王的,现在鱼王还在,只是脱离的主要贡献者的角色)和不入流的小小啊,gcin/hime 等等。目前比较常见的通信协议是自定义的 dbus 协议。

输入法框架复杂就复杂在它要处理与几乎所有应用程序的通信,除非这个应用程序上一个输入框没有。而且它是 CJK 用户唯一直接面对的系统程序,甚至比诸如音乐播放器 Amarok 什么的重要得多。没有输入法,这个操作系统再好,对你来说,也是个坏的操作系统。

另外一个复杂之处在于输入法需要提供几乎所有桌面环境下原生的界面。对,输入法框架的开发者不开发输入法引擎,但是他需要提供最底层,和最上层。但是,第一,输入法框架的作者是有桌面环境倾向的,一个人不可能日常既用 GNOME,又用 KDE,只有小白才会这么朝秦暮楚,读这篇介绍的都是开发者,你们自然懂; 第二,几乎所有的上游桌面环境在开发时都很少考虑输入法的兼容问题,至于集成,考虑不来。人的时间精力有限,作为用户可以要求输入法作者既开发输入法,又积极参与各类桌面环境的底层开发,作为开发者,这么说话应该掌嘴。因此输入法 bug 多可以理解,而且其中大多数的 bug 直接来自于最上层的输入法界面,大多数输入法界面的 bug 直接来自于上游的桌面环境。

第三个复杂之处在于输入法框架作为一个通信中心,需要有信可通。由于第二个复杂之处,目前输入法作者是自己去找信来通。这就存在着兼容问题。这是产生输入法框架的 bug 的一个来源。一个理想的输入环境是应用程序反馈给输入法一些信息供输入法处理,但目前几乎所有的图形环境/桌面环境/应用程序都没有提供这样的信息。

第四个复杂之处在于输入法框架没有一个标准的协议。目前使用的 dbus 协议都是输入法作者个人开发,不能在输入法框架之间兼容。但要求一个标准的协议有点强人所难。第一,我们是自由世界; 第二,输入法的完成度和历史不同,比如 scim 和 gcin 是第一古老,fcitx 是第二(后来有重写),ibus 是第三。他们有的使用了 dbus,有的可能没有。在这里用 Windows 的思维去考虑问题是不对的,因为 Windows 只有一个微软提供的输入法框架,所谓搜狗输入法,谷歌输入法,都是输入法引擎和输入法界面。甚至 Windows 和 Linux 的输入法开发者需要提供的东西都不一样。

输入法引擎

输入法引擎主要是用来处理比如输入连续的拼音,如何把它们切分成不同的字和词组这样的认字和断句的任务的程序。这点中文和西文很大不同,因为西文的是几乎不存在字这个概念的(26 个英文字母严格来说不是字,因为它们本身并无意义,而“说文解字”这样的书中,每一个方块字都有自己的出处和意思,这才是真正意义上的字),它们的句子只有词,而词和词之间是通过空格来划分的。而中文首先认字就是一个很大困难,存在五笔、拼音、区位等多种输入和认识字的方法,存在很多选择和冗余(因为大部分时候你只需要一个特定的字)。词组的划分又有比如两维、三维、多维等等各种语言和语义模型。

实际上所有的输入法框架用的引擎都大同小异,拼音有 libpinyin, libgooglepinyin(谷歌拼音), sunpinyin, 码表有五笔86, chewing(仓颉,新酷音),郑码,大易,以及一些比如印度语码表什么的,日文有 anthy,canna,wnn,skk,韩文就是 libhangul。这些都是引擎。

输入法界面

输入法界面是被最终用户直观感受到的图形界面。在 Linux 世界就是 ibus 的 gtk 界面,和 gnome-shell 外挂,以及 fcitx 的 gtk 界面和 kcm-fcitx 模块。它们和其他 gtk/kde 程序一样,本身就是一个 gtk/kde 程序。在 Windows 世界就是所谓的搜狗拼音、百度拼音等等。

输入法界面分为两部分。一部分叫做输入面板,主要用来显示拼音/五笔和候选词,一部分叫做配置页面,主要用来显示与输入法框架/引擎相关(不是每个输入法框架都有针对框架的配置选项)的配置选项。输入面板和配置页面与输入法框架本身的联系都不是很紧密,因此可以由外部程序来提供。比如 ibus 可以使用 kde playground 中的 kimpanel 或者 opendesktop.org 的 kimtoy 实现 kde 的输入面板或 qt 的输入面板,上面两个都是独立的 dbus 通信程序,监听输入法框架通过专有 dbus 协议传递的信号并做出反应。再比如 fcitx 的 kde 配置页面是在 kde 个人中心里面,这是更像是一个独立的 kde 模块而不是一个输入法模块。但是这都是传统意义上的输入法界面。因为输入法框架仍然是在主程序中提供一个图形界面的,比如 ibus 的 pygtk 和 fcitx 默认的 c。