什麼是輸入法?

什麼是輸入法?

輸入法從底層到上層可以簡單的分爲三類:

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

因此,和最終用戶和半瓶水的開發者討論輸入法是非常困難的,大部分時候都是雞同鴨講。最終用戶對輸入法的認識大部分停留在輸入法界面的層面上,也就是諸如搜狗輸入法換皮膚這個境界,而半瓶水的開發者可能認識到了“壁紙不是桌面環境”這個命題,但是他們的認識大部分停留在輸入法引擎的層面上(包括大多數 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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章