嵌入式系统汉字输入.doc_第1页
嵌入式系统汉字输入.doc_第2页
嵌入式系统汉字输入.doc_第3页
嵌入式系统汉字输入.doc_第4页
嵌入式系统汉字输入.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/bbs/viewthread.php?tid=8868&extra=page%3D21. 简单知识中文输入发我不多说,大家都用过,目前嵌入式系统中比较典型的中文输入法有诺基亚的T9 、 摩托罗拉的 i T A P 、爱立信的字能等, 这些 输入法的输入设备一般是数字键 0 9和一些功能键组成。除了支持中文的拼音和笔画外还支持诸如 日文、 韩文等其他国家的语言。中文输入法可分为拼音输入和笔画输入。 一般情况下拼音输入法相对笔画输入法, 重码率要高, 但简单易用,(再加个模式识别进行手写输入就更高级了,呵呵),我这里也是拼音输入,由于空间有效,不支持联想功能.2. 硬软件 硬件用的NXP的2138,LCD是台湾雄铎科技的,240*160,软件用的zlg的模板,uc2.52版,按键布局与手机一样,如2键为abc,3为def,等等3.前期准备3.1网上有许多的资料,给出了键盘数字组合对应的拼音组合和汉字组合,我也利用这个,如2,a,(char *)PY_mb_a,24,ai,(char *)PY_mb_ai,26,an,(char *)PY_mb_an,26,ao,(char *)PY_mb_ao,22,ba,(char *)PY_mb_ba,24,bi,(char *)PY_mb_bi,const char PY_mb_a =阿啊;const char PY_mb_ai =矮蔼艾爱隘碍霭;但有个问题,这个网上流传的拼音-汉字组合中汉字非常少,对于输入是远远不够的,比如说汶川的汶就没有,而且没有多音字,例如还的拼音属于huan,你打还就没有,这对于输入是不可以接收的,下面我讲一下我的解决方法.3.2寻找所有汉字的拼音,这个如果打开字典一个一个的输,恐怕没有一个月是干不成了,庆幸的是有人替我们做好了,在万能五笔输入法中有一个拼音记录文件,几乎包括了所有的汉字,拿来所用py_gb.rar (264.6 KB) py_gb.rar (264.6 KB)下载次数: 1132008-5-25 09:57这个文件中,有许多词组,是我们不需要的,需要剔掉,但手工的方式工作量太大,这里我们发挥计算机比较傻的优势来做这件事,用到一些VC的基本知识,相信大家都有这个能力CStdioFile read_file,read_new_file;CStdioFile write_file;CString my_str,temp_str,tf=;read_file.Open( py_gb.txt, CFile:modeRead,NULL ) ;write_file.Open( new_py_gb.txt, CFile:modeCreate | CFile:modeWrite,NULL ) ;while (read_file.ReadString(my_str)int i = my_str.Find( );if (my_str.GetLength() - i) 3)/* 是词组 */continue;else/* 保存到文件 */write_file.WriteString(my_str);write_file.WriteString(n);read_file.Close();write_file.Close();原理也非常简单,如果是词组,汉字的个数肯定大于1,在vc中,一个ASCII占一个字节,一个汉字占两个字节,整理后的文件如下new_py_gb.rar (65.71 KB) new_py_gb.rar (65.71 KB)下载次数: 962008-5-25 09:573.3在文件new_py_gb.txt中,列出了每个字的拼音,如a 啊a 阿a 呵a 吖a 嗄a 腌a 锕a 錒aes 厑ai 爱ai 矮ai 挨ai 哎ai 碍ai 癌ai 艾ai 唉ai 哀ai 蔼到这里又产生一个问题,必须将所有的同音汉字组合在一起,例如拼音为a的,应该这样a啊阿呵吖嗄腌锕錒vc程序如下:read_file.Open( py_file.c, CFile:modeRead,NULL ) ;read_new_file.Open(new_py_gb.txt, CFile:modeRead,NULL);write_file.Open( zhenli.txt, CFile:modeCreate | CFile:modeWrite,NULL ) ;while (read_file.ReadString(my_str)int i = my_str.Find(,);int j = my_str.Find(,i);temp_str = my_str.Mid(i + 2, j- 3);CString save_str = temp_str;while (read_new_file.ReadString(tf)int ll = tf.Find( );if (tf.Left(ll) = temp_str) save_str += tf.Right(2);write_file.WriteString(save_str );write_file.WriteString(n);read_new_file.SeekToBegin();原理就是把所有拼音相同的字组合在一起,这个过程比较慢,需要耐心等待,不要以为程序死掉了,呵呵,生成的zhenli.txt文件如下:a啊阿呵吖嗄腌锕錒e饿哦额鹅蛾扼俄讹阿遏峨娥恶厄鄂锇谔垩锷阏萼苊轭婀莪鳄颚腭愕呃噩鹗屙亚亜亞伪佮侉偔偽僞僫匎匼卾吪呝咢咹哑唖啈啊啐啞噁囐囮垭埡堊堨堮妸妿姶娾娿媕屵岋峉峩崿庵廅悪惡戹搕搤搹擜曷枙椏櫮欸歞歹歺洝涐湂玀珴琧痷皒睋砈砐砨砵硆硪磀礘胺蒍蕚蘁蚅蝁覨訛詻誐諤譌讍豟軛軶輵迗遌遻邑鈋鋨鍔鑩閜閼阨阸隘頞頟額顎餓餩騀鬲魤魥鰐鰪鱷鴳鵈鵝鵞鶚齃齶齾3.4又产生一个新问题,里面的字太多了,许多生僻的字连GB2312编码中都没有,这些字对于应用是没有用的,必须剔除,于是:找到GB2312编码的所有汉字啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥GB2312.rar (11.01 KB) GB2312.rar (11.01 KB)下载次数: 712008-5-25 10:10为了方便,做进一步的整理,将一个段位的所有字放到一行中:啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑北辈背贝钡倍狈备惫焙被奔苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛鞭边编贬扁便变卞辨辩辫遍标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳read_file.Open( gb2312.txt, CFile:modeRead,NULL ) ;write_file.Open( gb2312_new.txt, CFile:modeCreate | CFile:modeWrite,NULL ) ;int i = 0;while (read_file.ReadString(my_str)if (my_str = )continue;i+;tf += my_str;if (i = 6)write_file.WriteString(tf);write_file.WriteString(n);i = 0;tf = ;gb2312_new.rar (471 Bytes) gb2312_new.rar (471 Bytes)下载次数: 752008-5-25 10:103.5对比GB2312中有的汉字,依次查找zhenli.txt中的每个汉字是否是有效的,在这里我做了个假设,如果一个拼音下的某个汉字不存在,z则其后的汉字也不存在,即e饿哦额鹅蛾扼俄讹阿遏峨娥恶厄鄂锇谔垩锷阏萼苊轭婀莪鳄颚腭愕呃噩鹗屙亚亜亞伪佮侉偔偽僞僫匎匼卾吪呝咢咹哑唖啈啊啐啞噁囐囮垭埡中,“亜”不存在,则其后的字都剔除,这样是合理的,以为即使某个字存在,他的拼音现在也不用了read_file.Open( gb2312_new.txt, CFile:modeRead,NULL ) ;read_new_file.Open(zhenli.txt, CFile:modeRead,NULL);write_file.Open( valid_chinese.txt, CFile:modeCreate | CFile:modeWrite,NULL ) ;CString gb2312_buffer=;while (read_file.ReadString(my_str)gb2312_buffer+=my_str;while (read_new_file.ReadString(my_str)int i = 0;char * p_str = my_str.GetBuffer(0);CString used_in_str=;/* 去掉行首的拼音 */while (!(*p_str & 0x80)p_str+;i+;used_in_str = my_str.Left(i);temp_str = my_str.Right(my_str.GetLength()-i);for (i = 0;i temp_str.GetLength();i+,i+)tf = temp_str.Mid(i,2);/* 在GB2312的文件中查找是否存在 */if (-1 = (gb2312_buffer.Find(tf) /* 没发现此字,则认为后续的字都不存在 */ write_file.WriteString(used_in_str); write_file.WriteString(n); break;used_in_str+=tf;生成的文件为a啊阿呵吖嗄腌锕e饿哦额鹅蛾扼俄讹阿遏峨娥恶厄鄂锇谔垩锷阏萼苊轭婀莪鳄颚腭愕呃噩鹗屙m呒n嗯o哦喔噢附件valid_chinese.rar (13.49 KB) 2008-5-25 10:28, 下载次数: 83 3.6将valid_chines.txt中的格式向py_file.txt中的格式靠拢read_file.Open( py_file.txt,CFile:modeReadWrite,NULL ) ;read_new_file.Open(valid_chinese.txt, CFile:modeRead,NULL);write_file.Open(new_py_file.txt, CFile:modeWrite | CFile:modeCreate,NULL);while (read_new_file.ReadString(my_str)int i = 0;char * p_str = my_str.GetBuffer(0);CString used_in_str=;/* 去掉行首的拼音 */while (!(*p_str & 0x80)p_str+;i+;used_in_str = my_str.Right(my_str.GetLength() - i);/* 将第一个字去py_file.txt中寻找,找到后将本字符串替换到文件中 */tf = used_in_str.Left(2);CString ss;read_file.SeekToBegin();while (read_file.ReadString(ss)if (ss.Find(tf) != -1) /* 找到第一个位置 */ CString new_ss = ss.Left(ss.Find() + 1); new_ss += used_in_str; new_ss += ;n; write_file.WriteString(new_ss); break;但发现有一个新问题,依照上面的算法,如果多音字在行首,则会出现下面的问题:比如:在valid_chinese.txt中hai还海害咳氦孩骇咳骸亥嗨醢胲侅咍咴嗐嚡塰拸欬烸猲絯還郂酼閡阂頦颏餀饚駭駴liao了料撩聊撂疗廖燎辽僚寥镣潦钌蓼尥寮缭獠鹩嘹佬僇劳勞嫽尞尦屪嵺嶚嶛廫憀憭摎敹暸樛漻炓爎爒璙療瞭窷竂簝繚膋膫蟉蟟蟧豂賿蹘蹽轑遼鄝釕鏐鐐镠镽飂飉髎鷯chang长唱常场厂尝肠畅昌敞倡偿猖裳鲳氅菖惝嫦徜鬯阊怅伥昶苌娼仧倀倘僘償儻兏厰嘗嚐場塲尙尚廠悵晿暢棖椙淌淐焻玚琩瑒瑺瓺甞畼脹腸膓萇蟐裮誯鋹鋿錩鏛锠長镸閶闛韔鯧鱨鲿鼚而在py_file.txt中const char PY_mb_huan=欢还环桓缓幻宦唤换涣患焕痪豢;这样就可能将huan变为hai,幸亏这样的情况只有以上三个,所以手工调整一下即可还有一个特例就是“揣”的拼音需要特殊考虑,得到的文件如下: new_py_file.rar (13.9 KB) new_py_file.rar (13.9 KB)下载次数: 872008-5-25 12:59最后,就是再整理了,/* 按照数字的顺序重新排列数据 */read_new_file.Open(final-1.txt, CFile:modeRead,NULL);write_file.Open(final-2.txt, CFile:modeWrite | CFile:modeCreate,NULL);CString str2=,str3=,str4=,str5=,str6=,str7=,str8=,str9=;while (read_new_file.ReadString(my_str)char * left_char = my_str.GetBuffer(0);left_char += 2;my_str += n;switch(*left_char) case 2: str2 += my_str; break;case 3: str3 += my_str; break;case 4: str4 += my_str; break;case 5: str5 += my_str; break;case 6: str6 += my_str; break;case 7: str7 += my_str; break;case 8: str8 += my_str; break;case 9: str9 += my_str; break;default: break;write_file.WriteString(str2);write_file.WriteString(str3);write_file.WriteString(str4);write_file.WriteString(str5);write_file.WriteString(str6);write_file.WriteString(str7);write_file.WriteString(str8)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论