完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
1)实验平台:alientek 阿波罗 STM32F767 开发板 2)摘自《STM32F7 开发指南(HAL 库版)》关注官方微信号公众号,获取更多资料:正点原子 第五十九章 T9 拼音输入法实验 上一章,我们在 ALIENTEK 阿波罗 STM32 开发板上实现了手写识别输入,但是该方法只 能输入数字或者字母,不能输入汉字。本章,我们将给大家介绍如何在ALIENTEK阿波罗 STM32 开发板上实现一个简单的 T9 中文拼音输入法。本章分为如下几个部: 59.1 拼音输入法简介 59.2 硬件设计 59.3 软件设计 59.4 下载验证 59.1 拼音输入法简介 在计算机上汉字的输入法有很多种,比如拼音输入法、五笔输入法、笔画输入法、区位输 入法等。其中,又以拼音输入法用的最多。拼音输入法又可以分为很多类,比如全拼输入、双 拼输入等。 而在手机上,用的最多的应该算是 T9 拼音输入法了,T9 输入法全名为智能输入法,字库 容量九千多字,支持十多种语言。T9 输入法是由美国特捷通讯(Tegic Communications)软件 公司开发的,该输入法解决了小型掌上设备的文字输入问题,已经成为全球手机文字输入的标 准之一。 一般,手机拼音输入键盘如图 59.1.1 所示: 图 59.1.1 手机拼音输入键盘 在这个键盘上,我们对比下传统的输入法和 T9 输入法,输入“中国”两个字需要的按键 次数。传统的方法,先按 4 次 9,输入字母 z,再按 2 次 4,输入字母 h,再按 3 次 6,输入字 母 o,再按 2 次 6,输入字母 n,最后按 1 次 4,输入字母 g。这样,输入“中”字,要按键 12 次,接着同样的方法,输入“国”字,需要按 6 次,总共就是 18 次按键。 如果是 T9,我们输入“中”字,只需要输入:9、4、6、6、4,即可实现输入“中”字, 在选择中字之后,T9 会联想出一系列同中字组合的词,如:文、国、断、山等。这样输入“国” 字,我们直接选择即可,所以输入“国”字按键 0 次,这样 T9 总共只需要 5 次按键。 这就是 T9 智能输入法的优越之处。正因为 T9 输入法高效便捷的输入方式得到了众多手机 厂商的采用,以至于 T9 成为了使用频率最高知名度最大的手机输入法。 本章,我们实现的 T9 拼音输入法,没有真正的 T9 那么强大,我们这里仅实现输入部分, 不支持词组联想。 本章,我们主要通过一个和数字串对应的拼音索引表来实现 T9 拼音输入,我们先将汉语 拼音所有可能的组合全部列出来,如下所示: const u8 PY_mb_space []={""}; const u8 PY_mb_a []={"啊阿腌吖锕厑嗄錒呵腌"}; const u8 PY_mb_ai []={"爱埃挨哎唉哀皑癌蔼矮艾碍隘捱嗳嗌嫒瑷暧砹锿霭"}; const u8 PY_mb_an []={"安俺按暗岸案鞍氨谙胺埯揞犴庵桉铵鹌黯"}; ……此处省略 N 多组合 const u8 PY_mb_zu []={"足租祖诅阻组卒族俎菹镞"}; const u8 PY_mb_zuan []={"钻攥纂缵躜"}; const u8 PY_mb_zui []={"最罪嘴醉蕞觜"}; const u8 PY_mb_zun []={"尊遵樽鳟撙"}; const u8 PY_mb_zuo []={"左佐做作坐座昨撮唑柞阼琢嘬怍胙祚砟酢"};这里我们只列出了部分组合,我们将这些组合称之为码表,然后将这些码表和其对应的数 字串对应起来,组成一个拼音索引表,如下所示: const py_index py_index3[]= { {"" ,"",(u8*)PY_mb_space}, {"2","a",(u8*)PY_mb_a}, {"3","e",(u8*)PY_mb_e}, {"6","o",(u8*)PY_mb_o}, {"24","ai",(u8*)PY_mb_ai}, {"26","an",(u8*)PY_mb_an}, ……此处省略 N 多组合 {"94664","zhong",(u8*)PY_mb_zhong}, {"94824","zhuai",(u8*)PY_mb_zhuai}, {"94826","zhuan",(u8*)PY_mb_zhuan}, {"248264","chuang",(u8*)PY_mb_chuang}, {"748264","shuang",(u8*)PY_mb_shuang}, {"948264","zhuang",(u8*)PY_mb_zhuang}, }其中 py_index 是一个结构体,定义如下: typedef struct { u8 *py_input; //输入的字符串 u8 *py; //对应的拼音 u8 *pymb; //码表 }py_index; 其中 py_input,即与拼音对应的数字串,比如“94824”。py,即与 py_input 数字串对应的 拼音,如果 py_input=“94824”,那么 py 就是“zhuai”。最后 pymb,就是我们前面说到的码表。 注意,一个数字串可以对应多个拼音,也可以对应多个码表。 在有了这个拼音索引表(py_index3)之后,我们只需要将输入的数字串和 py_index3 索引 表里面所有成员的 py_input 对比,将所有完全匹配的情况记录下来,用户要输入的汉字就被确 定了,然后由用户选择可能的拼音组成(假设有多个匹配的项目),再选择对应的汉字,即完成 一次汉字输入。 当然还可能是找遍了索引表,也没有发现一个完全符合要求的成员,那么我们会统计匹配 数最多的情况,作为最佳结果,反馈给用户。比如,用户输入“323”,找不到完全匹配的情况, 那么我们就将能和“32”匹配的结果返回给用户。这样,用户还是可以得到输入结果,同时还 可以知道输入有问题,提示用户需要检查输入是否正确。 以上,就是我们的 T9 拼音输入法原理,关于拼音输入法,我们就介绍到这里。 最后,我们看看一个完整的 T9 拼音输入步骤(过程): 1) 输入拼音数字串 本章,我们用到的 T9 拼音输入法的核心思想就是对比用户输入的拼音数字串,所以必 须先由用户输入拼音数字串。 2) 在拼音索引表里面查找和输入字符串匹配的项,并记录 在得到用户输入的拼音数字串之后,在拼音索引表里面查找所有匹配的项目,如果有 完全匹配的项目,就全部记录下来,如果没有完全匹配的项目,则记录匹配情况最好的一 个项目。 3) 显示匹配清单里面所有可能的汉字,供用户选择. 将匹配项目的拼音和对应的汉字显示出来,供用户选择。如果有多个匹配项(一个数 字串对应多个拼音的情况),则用户还可以选择拼音。 4) 用户选择匹配项,并选择对应的汉字. 用户对匹配的拼音和汉字进行选择,选中其真正想输入的拼音和汉字,实现一次拼音 输入。 以上 4 个步骤,就可以实现一个简单的 T9 汉字拼音输入法。 59.2 硬件设计 本章实验功能简介:开机的时候先检测字库,然后显示提示信息和绘制拼音输入表,之后 进入等待输入状态。此时用户可以通过屏幕上的拼音输入表输入拼音数字串(通过 DEL 可以实 现退格),然后程序自动检测与之对应的拼音和汉字,并显示在屏幕上(同时输出到串口)。 如果有多个匹配的拼音,则通过 KEY_UP 和 KEY1 进行选择。按键 KEY0 用于清除一次输入, 按键 KEY2 用于触摸屏校准。 本实验用到的资源如下: 1) 指示灯 DS0 2) 四个按键(KEY0/KEY1/KEY2/KEY_UP) 3) 串口 4) LCD 模块(含触摸屏) 5) SPI FLASH 这些用到的硬件,我们在之前都已经介绍过,这里就不再介绍了。 59.3 软件设计 打开本章实验工程可以看到,我们在根目录文件夹下新建了一个 T9INPUT 的文件夹。在 该文件夹下面新建了 pyinput.c、pyinput.h 和 pymb.h 三个文件,然后在工程里面新建一个 T9INPUT 的组,将 pyinput.c 加入到该组下面。最后,将 T9INPUT 文件夹加入头文件包含路径。 打开 pyinput.c,代码如下: //拼音输入法 pyinput t9= { get_pymb, 0, }; //比较两个字符串的匹配情况 //返回值:0xff,表示完全匹配. // 其他,匹配的字符数 u8 str_match(u8*str1,u8*str2) { u8 i=0; while(1) { if(*str1!=*str2)break; //部分匹配 if(*str1==' |