输入法工作流程以Linux下输入法为例讲解,是因为Linux的输入法框架结构分得清楚,容易深入理解内部过程。
输入法框架结构大致分为底层输入框架、输入法引擎和前端界面三部分。这三部分用车比喻就是:输入框架就是车身,输入法引擎就是发动机,前端界面就是仪表盘。
输入框架起到调度核心作用,应用软件对接的不是输入法引擎,而是输入框架。输入框架统一管理键盘输入,分析键盘输入内容,如果是切换输入法的按键,输入框架收到指令后就挂载另一个输入法,如果是有关前端界面的按键(比如更改展示候选词的数量),就将指令转给前端界面进行操作,其余的按键当成字符外码,转给输入法引擎处理。
输入法引擎是文字转换的核心模块,真正负责处理按键转汉字的工作,也就是将字符的外码转换为内码。由于重码的问题,输入法引擎返给输入框架的是候选字列表,实际是候选字内码列表。每种输入法都是一个独立的引擎,大类上有五笔输入法引擎、双拼输入法引擎、全拼输入法引擎、自然码输入法引擎等。同样是全拼输入法引擎,因为开发者不同,又分为搜狗拼音输入法引擎、微软拼音输入法引擎、谷歌拼音输入法引擎等。
前端界面主要负责候选框、状态栏、皮肤、设置等显示界面。前端接到候选字内码列表后,将其转换为字形码显示在候选框中,供用户选取,然后将选中的文字内码返给输入法框架,输入法最后将文字内码传给应用软件,应用软件根据需要将内码转换为不同的字形码显示。
总结下输入法的主要工作流程:
键盘按键由输入法框架接收,然后转发给输入法引擎,输入法引擎分析外码,给出一系列候选字,将候选字返给输入法框架,输入法框架再转发给前端界面,前端界面将候选字内码转换为字形码在屏幕渲染,展示出候选字列表,用户选中文字,前端界面将其返给输入法框架,输入框架再转给应用软件显示出来。
通过这段描述可以看到,输入框架在其中的调度作用。这样折腾的优点是,前端界面和输入法引擎剥离开,简单点儿说就是换皮肤比较方便,皮肤不依赖于某个输入法引擎。Windows下输入法一般都是前端界面和输入法引擎融合在一起。