查看: 118|回复: 0

OpenHarmony中文输入法

[复制链接]

3

主题

2

回帖

20

积分

新手上路

积分
20
发表于 2025-3-30 12:34:14 | 显示全部楼层 |阅读模式
OpenHarmony**中文输入法**
1.              项目介绍
在系统输入法中加上中文输入法,首先了解中文输入法的开发需要什么功能,中英文切换入口、单字、词语、分词、词语联想及九宫格键盘等功能。
当前针对单字、词语、分词、词语联想所使用的数据库,先进行读写后词语时进行分库,将23个声母分开(此处因为只有应用层技术)后续需要封装词库
项目实现逻辑:
把不同的键盘分别封装,各自处理对应的逻辑及响应点击事件
https://forums.openharmony.cn/file:///C:/Users/zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg
https://forums.openharmony.cn/file:///C:/Users/zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg
import windowManager from '@ohos.window'
  1. 将KeyboardController 设置为窗口最上层控件
复制代码
  1. 封装单例InputHandler
复制代码
  1. 用于处理隐藏、显示窗口,监听键盘点击事件,处理响应的逻辑后的回调
复制代码
  1. [/code][code]记录用户的每一次字母键盘事件点击,通过getSelectNotes查询对应的单字中文
复制代码
  1. 通过getSelectWords查询选中单词的关联词组
复制代码
export function getChoiceWords(pinyin:string): [string]{
  1.   let allWords: [string] = [];
复制代码
  1.   let choiceWord: [string] =[];
复制代码
  1.   if(pinyin.indexOf('a',0)==0){
复制代码
  1.     allWords = aPhraseArr;
复制代码
  1.   }
复制代码
  1. choiceWord =  getSelectWords3(pinyin,allWords)
复制代码
  1.   if(choiceWord.length != 0){
复制代码
  1.     console.info(logTag +  "getChoiceWords_6: " + JSON.stringify(choiceWord))
复制代码
  1.   }
复制代码
  1.   return choiceWord;}
复制代码
2.              遇到问题
A. api8、9两个版本的接口有很多不同,api9中弃用了很多api8的接口,导致工程无法唤起,而且studio中没有报错信息,将项目用api9实现
B. 词组量大,某些词组合后编码过长,导致工程无法唤起,util.TextDecoder("utf-8") 将问题解决但解决不彻底,可能个别词组的文字无法进行解析,分词逻辑缩小词库的大小
C. 使用++来进行赋值,导致工程无法唤起
D. 循环方式,导致工程无法唤起
for(let i = 0;i < charList.length;i++){} 改为for(var i in charList.length) {}可解决
3.     目前进度
现在进行分词逻辑,将23个声母添加到数组中,其余韵母加上组合放到数组中,用户输入后进行声母韵母的组合后进行匹配 然后将组合好的拼音传到词库位置查找词组返回到用户的输入法页面。
  1. // @ts-nocheck
复制代码
const TAG = 'SpellTool'
var result: string = '';
var ym: Array = [
  1.   'a',
复制代码
  1.   'ai',
复制代码
  1.   'an',
复制代码
  1.   'ang',
复制代码
  1.   'ao',
复制代码
  1.   'b',
复制代码
  1.   'ba',
复制代码
  1.   'bai',
复制代码
  1.   'ban',
复制代码
  1.   'bang',
复制代码
  1.   'bao',
复制代码
  1.   'bei',
复制代码
  1.   'ben',
复制代码
  1.   'beng',
复制代码
  1.   'bu',
复制代码
  1.   'bi',
复制代码
  1.   'bian',
复制代码
  1.   'biao',
复制代码
  1.   'bie',
复制代码
  1.   'bin',
复制代码
  1.   'bing',
复制代码
  1.   'bo',
复制代码
  1.   'c',
复制代码
  1.   'ca',
复制代码
  1.   'cai',
复制代码
  1.   'can',
复制代码
  1.   'cang',
复制代码
  1.   'cao',
复制代码
  1.   'ce',
复制代码
  1.   'cen',
复制代码
  1.   'ceng',
复制代码
  1.   'cha',
复制代码
  1.   'chai',
复制代码
  1.   'chan',
复制代码
  1.   'chang',
复制代码
  1.   'chao',
复制代码
  1.   'che',
复制代码
  1.   'chen',
复制代码
  1.   'cheng',
复制代码
  1.   'chi',
复制代码
  1.   'chong',
复制代码
  1.   'chou',
复制代码
  1.   'chu',
复制代码
  1.   'chuai',
复制代码
  1.   'chuan',
复制代码
  1.   'chuang',
复制代码
  1.   'chui',
复制代码
  1.   'chun',
复制代码
  1.   'chuo',
复制代码
  1.   'ci',
复制代码
  1.   'cong',
复制代码
  1.   'cou',
复制代码
  1.   'cu',
复制代码
  1.   'cuan',
复制代码
  1.   'cui',
复制代码
  1.   'cun',
复制代码
  1.   'cuo',
复制代码
  1.   'd',
复制代码
  1.   'da',
复制代码
  1.   'dai',
复制代码
  1.   'dan',
复制代码
  1.   'dang',
复制代码
  1.   'dao',
复制代码
  1.   'de',
复制代码
  1.   'deng',
复制代码
  1.   'di',
复制代码
  1.   'dian',
复制代码
  1.   'diao',
复制代码
  1.   'die',
复制代码
  1.   'ding',
复制代码
  1.   'diu',
复制代码
  1.   'dong',
复制代码
  1.   'dou',
复制代码
  1.   'du',
复制代码
  1.   'duan',
复制代码
  1.   'dui',
复制代码
  1.   'dun',
复制代码
  1.   'duo',
复制代码
  1.   'dia',
复制代码
  1.   'den',
复制代码
  1.   'e',
复制代码
  1.   'ei',
复制代码
  1.   'en',
复制代码
  1.   'er',
复制代码
  1.   'f',
复制代码
  1.   'fa',
复制代码
  1.   'fan',
复制代码
  1.   'fang',
复制代码
  1.   'fei',
复制代码
  1.   'fen',
复制代码
  1.   'feng',
复制代码
  1.   'fo',
复制代码
  1.   'fou',
复制代码
  1.   'fu',
复制代码
  1.   'g',
复制代码
  1.   'ga',
复制代码
  1.   'gai',
复制代码
  1.   'gan',
复制代码
  1.   'gang',
复制代码
  1.   'gao',
复制代码
  1.   'ge',
复制代码
  1.   'gei',
复制代码
  1.   'gen',
复制代码
  1.   'geng',
复制代码
  1.   'gong',
复制代码
  1.   'gou',
复制代码
  1.   'gu',
复制代码
  1.   'gua',
复制代码
  1.   'guai',
复制代码
  1.   'guan',
复制代码
  1.   'guang',
复制代码
  1.   'gui',
复制代码
  1.   'gun',
复制代码
  1.   'guo',
复制代码
  1.   'h',
复制代码
  1.   'ha',
复制代码
  1.   'hai',
复制代码
  1.   'han',
复制代码
  1.   'hang',
复制代码
  1.   'hao',
复制代码
  1.   'he',
复制代码
  1.   'hei',
复制代码
  1.   'hen',
复制代码
  1.   'heng',
复制代码
  1.   'hong',
复制代码
  1.   'hou',
复制代码
  1.   'hu',
复制代码
  1.   'hua',
复制代码
  1.   'huai',
复制代码
  1.   'huan',
复制代码
  1.   'huang',
复制代码
  1.   'hui',
复制代码
  1.   'hun',
复制代码
  1.   'huo',
复制代码
  1.   'i',
复制代码
  1.   'j',
复制代码
  1.   'ji',
复制代码
  1.   'jia',
复制代码
  1.   'jian',
复制代码
  1.   'jiang',
复制代码
  1.   'jiao',
复制代码
  1.   'jie',
复制代码
  1.   'jin',
复制代码
  1.   'jing',
复制代码
  1.   'jiong',
复制代码
  1.   'jiu',
复制代码
  1.   'ju',
复制代码
  1.   'juan',
复制代码
  1.   'jue',
复制代码
  1.   'jun',
复制代码
  1.   'k',
复制代码
  1.   'ka',
复制代码
  1.   'kai',
复制代码
  1.   'kan',
复制代码
  1.   'kang',
复制代码
  1.   'kao',
复制代码
  1.   'ke',
复制代码
  1.   'ken',
复制代码
  1.   'keng',
复制代码
  1.   'kong',
复制代码
  1.   'kou',
复制代码
  1.   'ku',
复制代码
  1.   'kua',
复制代码
  1.   'kuai',
复制代码
  1.   'kuan',
复制代码
  1.   'kuang',
复制代码
  1.   'kui',
复制代码
  1.   'kun',
复制代码
  1.   'kuo',
复制代码
  1.   'l',
复制代码
  1.   'la',
复制代码
  1.   'lai',
复制代码
  1.   'lan',
复制代码
  1.   'lang',
复制代码
  1.   'lao',
复制代码
  1.   'le',
复制代码
  1.   'lei',
复制代码
  1.   'leng',
复制代码
  1.   'li',
复制代码
  1.   'lia',
复制代码
  1.   'lian',
复制代码
  1.   'liang',
复制代码
  1.   'liao',
复制代码
  1.   'lie',
复制代码
  1.   'lin',
复制代码
  1.   'ling',
复制代码
  1.   'liu',
复制代码
  1.   'long',
复制代码
  1.   'lou',
复制代码
  1.   'lu',
复制代码
  1.   'luan',
复制代码
  1.   'lue',
复制代码
  1.   'lun',
复制代码
  1.   'luo',
复制代码
  1.   'lv',
复制代码
  1.   'm',
复制代码
  1.   'ma',
复制代码
  1.   'mai',
复制代码
  1.   'man',
复制代码
  1.   'mang',
复制代码
  1.   'mao',
复制代码
  1.   'me',
复制代码
  1.   'mei',
复制代码
  1.   'men',
复制代码
  1.   'meng',
复制代码
  1.   'mi',
复制代码
  1.   'mian',
复制代码
  1.   'miao',
复制代码
  1.   'mie',
复制代码
  1.   'min',
复制代码
  1.   'ming',
复制代码
  1.   'miu',
复制代码
  1.   'mo',
复制代码
  1.   'mou',
复制代码
  1.   'mu',
复制代码
  1.   'n',
复制代码
  1.   'na',
复制代码
  1.   'nai',
复制代码
  1.   'nan',
复制代码
  1.   'nang',
复制代码
  1.   'nao',
复制代码
  1.   'ne',
复制代码
  1.   'nei',
复制代码
  1.   'nen',
复制代码
  1.   'neng',
复制代码
  1.   'ni',
复制代码
  1.   'nian',
复制代码
  1.   'niang',
复制代码
  1.   'niao',
复制代码
  1.   'nie',
复制代码
  1.   'nin',
复制代码
  1.   'ning',
复制代码
  1.   'niu',
复制代码
  1.   'nong',
复制代码
  1.   'nou',
复制代码
  1.   'nu',
复制代码
  1.   'nuan',
复制代码
  1.   'nue',
复制代码
  1.   'nuo',
复制代码
  1.   'nv',
复制代码
  1.   'o',
复制代码
  1.   'ou',
复制代码
  1.   'p',
复制代码
  1.   'pa',
复制代码
  1.   'pai',
复制代码
  1.   'pan',
复制代码
  1.   'pang',
复制代码
  1.   'pao',
复制代码
  1.   'pei',
复制代码
  1.   'pen',
复制代码
  1.   'peng',
复制代码
  1.   'pi',
复制代码
  1.   'pian',
复制代码
  1.   'piao',
复制代码
  1.   'pie',
复制代码
  1.   'pin',
复制代码
  1.   'ping',
复制代码
  1.   'po',
复制代码
  1.   'pou',
复制代码
  1.   'pu',
复制代码
  1.   'q',
复制代码
  1.   'qi',
复制代码
  1.   'qia',
复制代码
  1.   'qian',
复制代码
  1.   'qiang',
复制代码
  1.   'qiao',
复制代码
  1.   'qie',
复制代码
  1.   'qin',
复制代码
  1.   'qing',
复制代码
  1.   'qiong',
复制代码
  1.   'qiu',
复制代码
  1.   'qu',
复制代码
  1.   'quan',
复制代码
  1.   'que',
复制代码
  1.   'qun',
复制代码
  1.   'r',
复制代码
  1.   'ran',
复制代码
  1.   'rang',
复制代码
  1.   'rao',
复制代码
  1.   're',
复制代码
  1.   'ren',
复制代码
  1.   'reng',
复制代码
  1.   'ri',
复制代码
  1.   'rong',
复制代码
  1.   'rou',
复制代码
  1.   'ru',
复制代码
  1.   'ruan',
复制代码
  1.   'rui',
复制代码
  1.   'run',
复制代码
  1.   'ruo',
复制代码
  1.   's',
复制代码
  1.   'sa',
复制代码
  1.   'sai',
复制代码
  1.   'san',
复制代码
  1.   'sang',
复制代码
  1.   'sao',
复制代码
  1.   'se',
复制代码
  1.   'sen',
复制代码
  1.   'seng',
复制代码
  1.   'sha',
复制代码
  1.   'shai',
复制代码
  1.   'shan',
复制代码
  1.   'shang',
复制代码
  1.   'shao',
复制代码
  1.   'she',
复制代码
  1.   'shen',
复制代码
  1.   'sheng',
复制代码
  1.   'shi',
复制代码
  1.   'shou',
复制代码
  1.   'shu',
复制代码
  1.   'shua',
复制代码
  1.   'shuai',
复制代码
  1.   'shuan',
复制代码
  1.   'shuang',
复制代码
  1.   'shui',
复制代码
  1.   'shun',
复制代码
  1.   'shuo',
复制代码
  1.   'si',
复制代码
  1.   'song',
复制代码
  1.   'sou',
复制代码
  1.   'su',
复制代码
  1.   'suan',
复制代码
  1.   'sui',
复制代码
  1.   'sun',
复制代码
  1.   'suo',
复制代码
  1.   't',
复制代码
  1.   'ta',
复制代码
  1.   'tai',
复制代码
  1.   'tan',
复制代码
  1.   'tang',
复制代码
  1.   'tao',
复制代码
  1.   'te',
复制代码
  1.   'teng',
复制代码
  1.   'ti',
复制代码
  1.   'tian',
复制代码
  1.   'tiao',
复制代码
  1.   'tie',
复制代码
  1.   'ting',
复制代码
  1.   'tong',
复制代码
  1.   'tou',
复制代码
  1.   'tu',
复制代码
  1.   'tuan',
复制代码
  1.   'tui',
复制代码
  1.   'tun',
复制代码
  1.   'tuo',
复制代码
  1.   'u',
复制代码
  1.   'v',
复制代码
  1.   'w',
复制代码
  1.   'wa',
复制代码
  1.   'wai',
复制代码
  1.   'wan',
复制代码
  1.   'wang',
复制代码
  1.   'wei',
复制代码
  1.   'wen',
复制代码
  1.   'weng',
复制代码
  1.   'wo',
复制代码
  1.   'wu',
复制代码
  1.   'x',
复制代码
  1.   'xi',
复制代码
  1.   'xia',
复制代码
  1.   'xian',
复制代码
  1.   'xiang',
复制代码
  1.   'xiao',
复制代码
  1.   'xie',
复制代码
  1.   'xin',
复制代码
  1.   'xing',
复制代码
  1.   'xiong',
复制代码
  1.   'xiu',
复制代码
  1.   'xu',
复制代码
  1.   'xuan',
复制代码
  1.   'xue',
复制代码
  1.   'xun',
复制代码
  1.   'y',
复制代码
  1.   'yao',
复制代码
  1.   'ye',
复制代码
  1.   'yi',
复制代码
  1.   'yin',
复制代码
  1.   'ying',
复制代码
  1.   'yo',
复制代码
  1.   'yong',
复制代码
  1.   'you',
复制代码
  1.   'yu',
复制代码
  1.   'yuan',
复制代码
  1.   'yue',
复制代码
  1.   'yun',
复制代码
  1.   'ya',
复制代码
  1.   'yan',
复制代码
  1.   'yang',
复制代码
  1.   'z',
复制代码
  1.   'za',
复制代码
  1.   'zai',
复制代码
  1.   'zan',
复制代码
  1.   'zang',
复制代码
  1.   'zao',
复制代码
  1.   'ze',
复制代码
  1.   'zei',
复制代码
  1.   'zen',
复制代码
  1.   'zeng',
复制代码
  1.   'zha',
复制代码
  1.   'zhai',
复制代码
  1.   'zhan',
复制代码
  1.   'zhang',
复制代码
  1.   'zhao',
复制代码
  1.   'zhe',
复制代码
  1.   'zhen',
复制代码
  1.   'zheng',
复制代码
  1.   'zhi',
复制代码
  1.   'zhong',
复制代码
  1.   'zhou',
复制代码
  1.   'zhu',
复制代码
  1.   'zhua',
复制代码
  1.   'zhuai',
复制代码
  1.   'zhuan',
复制代码
  1.   'zhuang',
复制代码
  1.   'zhui',
复制代码
  1.   'zhun',
复制代码
  1.   'zhuo',
复制代码
  1.   'zi',
复制代码
  1.   'zong',
复制代码
  1.   'zou',
复制代码
  1.   'zu',
复制代码
  1.   'zuan',
复制代码
  1.   'zui',
复制代码
  1.   'zun',
复制代码
  1.   'zuo',
复制代码
  1. ]
复制代码
  1. [/code]export function trimSpecll(spell: string) {
  2. [code]  result = '';
复制代码
  1.   console.info(TAG + ' trimSpecll')
复制代码
  1.   console.info(TAG + ' trimSpecll_0 ' + spell.length)
复制代码
  1.   findpy(spell)
复制代码
  1.   return result;
复制代码
  1. }
复制代码
  1. [/code]function findpy(py: string) {
  2. [code]  console.info(TAG + ' findpy_01 ' + py)
复制代码
  1.   var temp: number = 0;
复制代码
  1.   let py2: [string] = py.split("");
复制代码
  1.   console.info(TAG + ' findpy_02 ' + py2.toString())
复制代码
  1.   for (var i = 0; i < ym.length; i++) {
复制代码
  1.     for (var j = 0; j 2){[/b]
  2. [b]// [/b][b]多字,两个或两个字以上的情况[/b]
  3. [b]            console.info(logTag +  "getChoiceWords_10: need fc " + selStr +' cici '+ cici.toString())[/b]
  4. [b]            section = getChoiceWords(selStr);[/b]
  5. [b]            console.info(logTag +  "getChoiceWords_10: need fc2 "+ selStr +'  ' + (section == null) + 'length ' + section.length)[/b]
  6. [b]            if(section!=null&&section.length==0){[/b]
  7. [b]// [/b][b]不能一次完成搜索的分词词汇,比如拼音anbomo[/b]
  8. [b]              curFenciPy = fenci[/b]
  9. [b]              console.info(logTag +  "getChoiceWords_10: need fd " + fenci)[/b]
  10. [b]              let fenci1:[string] = cici[/b]
  11. [b]              console.info(logTag +  "getChoiceWords_10: need fe " + fenci1[0])[/b]
  12. [b]              for (var index = 0; index < fenci1.length-1; index++) {[/b]
  13. [b]                console.info(logTag +  "getChoiceWords_10: need ff " + fenci1[index])[/b]
  14. [b]              }[/b]
  15. [b]              curPosition = 0;[/b]
  16. [b]              curFenci = fenci1;[/b]
  17. [b]// [/b][b]不能一次完成搜索的分词词汇,比如拼音anbomo,则从第一个开始搜索[/b]
  18. [b]              section = getChoiceWords(fenci1[0]);[/b]
  19. [b]            }else{[/b]
  20. [b]// [/b][b]能一次完成搜索的分词词汇,比如拼音baicai,无需特殊处理,需要把当前分词的拼音数组置为[][/b]
  21. [b]              console.info(logTag +  "getChoiceWords_10: need fc2a "+ selStr +'  ' + (section == null) + ', fenci ' + fenci)[/b]
  22. [b]              curFenciPy = fenci;[/b]
  23. [b]              curFenci = [][/b]
  24. [b]            }[/b]
  25. [b]          } else{[/b]
  26. [b]// [/b][b]单字,正常操作[/b]
  27. [b]            curFenciPy = fenci;[/b]
  28. [b]            curFenci = [];[/b]
  29. [b]            section = getChoiceWords(selStr);[/b]
  30. [b]          }[/b]
  31. [b]          console.info(logTag +  "getChoiceWords_10: need fg " + section)[/b]
  32. [b]          AppStorage.SetOrCreate('selTexList',section)[/b]
  33. [b]          if(curFenciPy.length>0){[/b]
  34. [b]            AppStorage.SetOrCreate('promptText',curFenciPy)[/b]
  35. [b]          }[/b]
  36. 分词选取处理逻辑:
  37. [list=1]判断是否是未处理完全的分词,如果则从指定的position进行查询,将查询到的结果进行存储;正常的词汇不用特殊处理;对于还未查询选择完的分词,使用混合排版的方式,放入到输入框。比如:安博mu (分词拼音为: an bo mu)
  38. [/list][b]下面是根据分词情况进行字词选取逻辑[/b]
  39. // 判断是是分词,词汇和单字类型的已被过滤掉
  40. if(curFenci.length>0){
  41. [code]  curPosition ++;
复制代码
  1.   console.log('aaa-->listItem fcP '+curPosition)
复制代码
  1. // 分词进行逐字查询
复制代码
  1.   let section1 =  getChoiceWords(curFenci[curPosition]);
复制代码
  1.   console.log('aaa-->listItem fcP '+section1)
复制代码
  1. //将查询到的字词进行存储
复制代码
  1.   AppStorage.SetOrCreate('selTexList',section1);
复制代码
  1. }
复制代码
  1. // 选择词汇,将选择的词汇放入输入框数据库
复制代码
  1. selText.push(listItem)
复制代码
  1. AppStorage.SetOrCreate('inputSelTexts',selText)
复制代码
  1. console.log('aaa-->listItem fcP_01 ' + curFenci.length + "textlength "+curFenci.toString()+ ', selText ' + selText.length + " , " + selText.toString() )
复制代码
  1. textFenci = []
复制代码
  1. // 进行字词和分词拼音的混合
复制代码
if(curFenci.length - 1>selText.length){
  1.   console.log('aaa-->listItem fcP_02 ')
复制代码
  1. // 已选择的字词
复制代码
  1.   for(var i = 0; i< selText.length; i++){
复制代码
  1.     textFenci.push(selText[i])
复制代码
  1.   }
复制代码
  1.   console.log('aaa-->listItem fcP_03 ')
复制代码
  1. // 未进行查询的拼音
复制代码
  1.   for (var j = selText.length; j < curFenci.length-1; j++) {
复制代码
  1.     textFenci.push(curFenci[j])
复制代码
  1.     textFenci.push(' ')
复制代码
  1.   }
复制代码
  1.   console.log('aaa-->listItem fcP_04 ')
复制代码
  1. // 将分词的最终结果放入输入框
复制代码
  1.   AppStorage.SetOrCreate('inputSelTexts',textFenci)
复制代码
  1. } else{
复制代码
  1.   this.isClickShow = !this.isClickShow
复制代码
  1.   AppStorage.SetOrCreate('isMoreText',this.isClickShow)
复制代码
  1. }
复制代码
4.**后续想法**
首先是将分词进行完成 目前分词的词库已经写完,逻辑正在进行,后续进行九宫格的开发以及词库的封装。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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