嵌入式系统汉字输入
嵌入式系统下的矢量汉字显示技术

第17期2023年9月无线互联科技Wireless Internet TechnologyNo.17September,2023作者简介:张晓明(1985 ),男,陕西礼泉人,高级工程师,本科;研究方向:航空电子技术㊂嵌入式系统下的矢量汉字显示技术张晓明(中航西安飞机工业集团股份有限公司,陕西西安710089)摘要:嵌入式系统下的汉字显示一直是软件开发的难点,由于一般只支持点阵汉字,并支持矢量汉字,已经不能满足综合模块化航电架构下大屏显示和触摸控制的要求㊂文章通过分析基于贝塞尔曲线显示矢量汉字的原理,综合比较选择插值补偿系数,结合具体实例进行了测试验证㊂结果表明,采用该方法能够实现包括宋体㊁黑体等各种字体和字号的高质量显示,对汉字旋转㊁缩放变换后显示效果不失真,满足了大屏触控模式下对汉字缩放的显示要求㊂关键词:嵌入式系统;点阵汉字;矢量汉字;贝塞尔曲线;汉字轮廓中图分类号:TP311.5㊀㊀文献标志码:A 0㊀引言㊀㊀嵌入式系统由于资源有限,大多只支持点阵汉字,不支持矢量汉字[1]㊂点阵字库采用.c 文件方式储存信息,每个字信息都包含在一个数据结构中,其中包含了字体的所有点信息,字体显示时根据宽高将点信息直接送入显存显示㊂这种方式的字体实现简单㊁显示速度快㊂随着综合模块化航电(Integrated Modular Av -ionics,IMA)架构的发展[2],大屏显示和触摸控制已成为主流,不仅要求画面中汉字能清晰显示,更提出了自由旋转和缩放的新要求㊂目前,传统的基于点阵汉字的实现方法存在一些局限性,点阵汉字每种字体和字号均需对应的字库文件,如显示宋体(16ˑ16㊁24ˑ24㊁32ˑ32)㊁黑体(16ˑ16㊁24ˑ24㊁32ˑ32)就需要6个不同的字库文件,维护管理十分麻烦;点阵汉字显示画面进行旋转和缩放变换时,汉字产生模糊失真,效果不佳㊂为适应大屏触摸控制下对汉字的显示要求,本文摒弃了传统的基于点阵的汉字显示方式,提出一种基于贝塞尔曲线的矢量汉字显示方法㊂1㊀贝塞尔曲线显示汉字原理1.1㊀获取汉字轮廓㊀㊀矢量字体中的每一个字形是通过数学曲线来描述的,它包含了字形边界上的关键点,连续的导数信息等,矢量字体主要包括Type1㊁TrueType㊁OpenType 和CFF 等格式,采用几何学中的二次/三次贝塞尔样条曲线及直线来描述字体的外形轮廓㊂由于每个字符的轮廓信息是根据字形索引来存放的,而字形索引又通过字符的Unicode 编码来获取,所以首先需要先设置字符的编码格式,假如某些嵌入式系统的默认的字符编码是GBK,因此还需要将GBK 转换为Unicode,然后通过Unicode 编码值来获取字形索引,最后就可以在字库文件中得到字符的轮廓数据㊂1.2㊀汉字轮廓分析㊀㊀汉字轮廓的贝塞尔曲线由起始点㊁终止点和控制点组成,描述如下:(1)FT_CURVE_TAG_ON:点在贝塞尔曲线上,为起始点或终止点,其他的点为OFF 点,表明该点不在贝塞尔曲线上,为贝塞尔曲线的控制点㊂(2)FT_CURVE_TAG_CONIC:二次贝塞尔曲线控制点,一条二次贝塞尔曲线由一个起始点㊁一个终止点和一个控制点确定,如图1所示㊂(3)FT_CURVE_TAG_CUBIC:三次贝塞尔曲线控制点,一条三次贝塞尔曲线由一个起始点㊁一个终止点和两个控制点确定,如图2所示㊂图1㊀二次贝塞尔曲线汉字轮廓的贝塞尔曲线插值补偿按以下3种情况进行处理㊂(1)轮廓线的点为FT_CURVE_TAG_ON,仅将该点记录至锚点集,相当于一次贝塞尔曲线(即线段),不用作插值处理㊂图2㊀三次贝塞尔曲线(2)轮廓线的点为FT_CURVE_TAG_CONIC:计算并更新起始点和终止点,分为以下两种情况:若该控制点已经是轮廓线的第一个点,则起始点为轮廓线的最后一个点,否则为锚点集的上一个点㊂若该控制点为轮廓线的最后一个点,则终止点为锚点集第一个点,否则为轮廓线下一个点㊂进行二次贝塞尔曲线插值,分为以下两种情况:若轮廓线下一个点为FT_CURVE_TAG_ON,起始点和终止点按(1)条处理,然后进行二次贝塞尔插值补偿;若轮廓线下一个点仍为FT_CURVE_TAG_ CONIC,则终止点为该2个控制点的中值,然后进行二次贝塞尔曲线插值补偿㊂二次贝塞尔曲线插值公式为:B(t)=(1-t)2P0+2t(1-t)P1+t2P2,tɪ[0,1];其中:P0为起始点,P1为控制点,P2为终止点,t 为补偿系数,一般取0.2㊂(3)轮廓线点为FT_CURVE_TAG_CUBIC:将该控制点作为第一个控制点,计算并更新起始点和终止点,分为以下几种情况:若该控制点已经是轮廓线的第一个点,则起始点为轮廓线的最后一个点,否则为锚点集的上一个点;若该控制点为轮廓线倒数第二个点,第二个控制点为最后一个点,终止点为锚点集第一个点,否则为轮廓线下一个点;其他情况皆无效㊂本研究进行3次贝塞尔曲线插值;3次贝塞尔曲线插值公式为:B(t)=(1-t)3P0+3t(1-t)2P1+3(1-t)t2P2+ (1-t)3P3,tɪ[0,1];其中:P0为起始点,P1为控制点1,P2为控制点2,P3为终止点,t为补偿系数,一般取0.2㊂1.3㊀显示矢量汉字㊀㊀循环逐个分析汉字串的每一个汉字,将汉字转为相应的Unicode编码值㊂在矢量字体的字形索引库中进行索引查找,获得字形轮廓数据集㊂根据实际缩放或旋转需要,对汉字轮廓数据集进行相应的旋转㊁缩放等变换,然后遍历轮廓数据集中的每条封闭的轮廓线,对轮廓线的起始点㊁终止点㊁控制点进行不同的处理,进行贝塞尔一次/二次/三次插值补偿㊂对补偿后的轮廓线进行栅格化处理[3],将可能存在的凹边形分解为多个凸边形,直至遍历完所有的轮廓数据集,最后调用GDI或OpenGL等图形接口将已栅格化的数据进行渲染[4-5],完成汉字的显示,详细处理流程如图3所示㊂图3㊀矢量汉字显示处理流程2 实例分析2.1㊀测试环境㊀㊀采用定制设计的显示处理板进行测试验证㊂其中,CPU为ARM Cortex-M4嵌入式处理器,显示设备为10寸触摸控制屏㊂2.2㊀测试结果2.2.1㊀汉字轮廓显示㊀㊀以汉字 航 为例,分别以宋体和黑体且贝塞尔插值系数t取1.0㊁0.5和0.2按本方法进行测试验证,测试验证结果如图4所示㊂其中黑色线㊁蓝色线和红色线分别描述了汉字轮廓线中线段和二/三次贝塞尔曲线分布及插值情况,分析可见,贝塞尔插值系数取1.0和0.5时,汉字轮廓过渡不平滑,显示效果差㊂贝塞尔插值系数取0.2时,汉字轮廓平滑,显示效果满足要求,而如果取值更小时,平滑效果改良不明显,计算量反而大幅增加㊂2.2.2㊀缩放及旋转显示㊀㊀按本方法对汉字 航 宋体正常显示(字号20,t= 0.2)进行缩放及旋转测试,缩放及旋转测试结果如图分析可见,本方法通过贝塞尔曲线的矢量数据变换,完成汉字的显示㊁旋转和缩放,其显示效果不会发生任何模糊和失真㊂2.2.3㊀传统显示汉字与本方法显示汉字对比㊀㊀使用ARM Cortex -M4图形接口进行渲染后的汉字效果如图6所示㊂图4㊀矢量汉字轮廓图5㊀矢量汉字缩放及旋转图6㊀显示效果对比㊀㊀分析可见,传统方法对汉字进行旋转和缩放必然模糊失真,如进一步缩放,效果将完全模糊根本不可辨认;而本方法对汉字进行任意旋转㊁缩放均能保持良好㊁平滑的显示效果㊂3 结语㊀㊀嵌入式系统由于资源有限,一般只支持点阵汉字,不支持矢量汉字,本文提出了一种基于贝塞尔曲线的矢量汉字显示方法㊂该方法首先分析了矢量汉字的显示原理,在矢量字体文件中通过汉字编码值获取轮廓线,然后基于贝塞尔曲线进行插值补偿,插值补偿系数根据插值计算量和显示效果综合权衡取值,最后在基于ARM Cortex-M4嵌入式处理器的显示处理板上进行了测试验证㊂结果表明,该方法能够实现包括宋体㊁黑体等各种字体和字号的高质量显示,无需反复生成字库文件;对汉字进行任意次旋转㊁缩放变换后,汉字显示效果不失真㊁不模糊,满足了综合模块化航电架构下大屏触摸控制的显示要求,该矢量汉字显示方法不仅适用于STM32㊁ARM等嵌入式裸机系统,同样适用于VxWorks㊁FreeRTOS㊁QNX㊁uClinux 等主流嵌入式操作系统㊂参考文献[1]凌云锋.VxWorks5.5平台下矢量字体显示的实现[J].计算机系统应用,2011(7):203-206.[2]杨军祥,杨涛,李成文,等.综合模块化航空电子核心系统技术研究[J].航空计算技术,2017(3): 106-110.[3]陈振杰,周琛,李飞雪,等.矢量多边形栅格化算法快速并行化方法研究[J].遥感信息,2014(5): 3-8.[4]王汐,蒋林,张敏.GDI函数硬件加速器设计与实现[J].微电子学与计算机,2014(5):44-47. [5]侯冬曼,陈武喝,马佳洪.基于OpenGL的虚拟仿真实验设计[J].实验室研究与探索,2019(6): 89-92.(编辑㊀王永超)Vector Chinese character display technology in embedded systemZhang XiaomingAVIC Xi an Aircraft Insdustry Group Co. Ltd. Xi an710089 ChinaAbstract The display of Chinese characters in embedded system has always been a difficult point in software development.Because it generally only supports dot matrix Chinese characters and vector Chinese characters it can no longer meet the requirements of large-screen display and touch control under the integrated modular avionics architecture.In this paper the principle of displaying vector Chinese characters based on Bezier curve is analyzed and the interpolation compensation coefficient is comprehensively compared and bined with specific examples the results show that this method can realize high-quality display of various fonts and font sizes including Song Ti and Bold and the display effect is not distorted after Chinese characters are rotated and scaled which meets the display requirements of Chinese characters in large-screen touch mode.Key words embedded system dot matrix Chinese characters vector Chinese characters bessel curve Chinese character outline。
ARM系统的汉字处理

0 引 言
A vne i ahnsA M) dacdRs M ci ( R 系列 是 目前 很 广 的 c e 嵌 入系统 处理 器系 列 , 开发系 统 的功处 理汉 字需 要 .
1 1 F A H资源 . LS
1 2 R M 资源 . A
与单片机不同的是 ,R 的存储资源和运算能力 AM
完全 可 以满足汉 字 处理 的需 要 , 不 需 要 特别 的 系统 并
扩展 。
多数 A M R 7系统 板配 置 的 R M 超 过 1M, A 汉字 处
理时需要在内存 中建立编码处理表, 进行检索 , 需要使 用大 约需要 3 2K的 内存 .
1 A M 的资源 R
A M运 行 在 6 H 及 以上频 率 , R M 和 R M R 6M z 其 O A 的寻址 能力 总共 达 26M[ ]目前 供应 的通 用 的 目标 5 注1. 板系统 配置 差异 较 大 , 数配 置 的 比较 丰 富 的 F A H 多 L S
2 汉字处理
关键 词 : 入 系统 ; R 汉 字 嵌 A M;
中图分类号 :V 9 .2 T 3 1 1
文献标识码 : A
文章编号 :0 8 3X 20 ) 1 030 10 —56 (070 — 6—3 0
Chn s a a t rIp tn ie e Ch r ce ut g i ARM y t m n i n S se
ZH ANG ib C Ha — o, HEN 耽 n— l an, ONG ec e S Zh —h n
( hj n tr osrac dH doo e oee ag o 10 8C ia Z eagWa nevnya yr w r lg ,H nz u30 1 ,hn) i eC n p C h
【计算机应用】_汉字输入法_期刊发文热词逐年推荐_20140724

2010年 序号 1 2 3 4 5 6 7 8 9 10 11 12 13 14
科研热词 键盘 输入法 联机手写输入法 编辑距离 笔画 相似重复记录 标点符号前置分类器 数据清洗 数字墨水 指画 字符串相似度 字符串匹配 windows mobile com组件技术
推荐指数 1 1 1 1 1 1 1 1 1 1 1 1 1 1
2011年 序号 1 2 3 4 5
科研热词 嵌入式系统 嵌入式linux 中文输入法 sqlite3 qt/e4
推荐指数 1 1 1 1 1
2012年 序号 1 2 3 4 5 6 7
科研热词 输入法 计算机 汉语 汉字输入法 汉字 文字 应用程序
推荐指数013年 科研热词 多设备支持 中文输入法 n元文法模型 microwindows 推荐指数 1 1 1 1
2008年 序号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
科研热词 逆转 输入汉字 词汇 自定义词组 自定义 聊天窗口 笔画 汉字键盘输入 汉字输入法 汉字手写输入 有穷状态自动机 日常使用 文字 操作系统 拼音输入法 gba
推荐指数 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
便携系统中的汉字信息处理

系统汉字显示采用 l 中断扫描动态刷新 , ms 即显示地址 P . P . 1-1 4 7每次 中断时均被修改 , 而 P .@1 1 - 2又作为扩展 R M和列扫描锁存器的地 0 A 址译码栈。因此, 进人 中断服务程序时 , 必须先把 P 口映象字节压人堆栈 , 1 然后对 P 口映象进行 1 操作。中断返回前 , 将刷新 的 P . P . 内容和堆 1-1 3 7 栈保护的 P . P2内容进行“ 操作后写人 P I 1 - 0 或” l 口及映象字节。这样, 采用尽量少的资源完成了点 阵汉字库寻址功能。 2 A汉字信息存储结构。 单片杌双字信息的存 储可以分成字库 区、 代码区、 点阵区和控制区四个 部分 。 () 1汉字点阵字库区。 存储 H K1 Z 6国标字库。 根据需要加入扩充字符。 () 2汉字代玛 存储区。 该系统按句子顺序存储 汉字区位码信息。 每个汉字用两字节表示 , 每个句 子的前、 1 后 个字节加入句首和句尾标志 , 代码 区 最后 1 的 后 1 字 节写 人结 束标 志 。 区位码 只 句 个 包含数字 0 9标志字节可在 A F中任选。 -, l  ̄ () 3点阵信息存储区。 点阵信 息与代码区内容 对应 , 按句子顺序 啸敬 。90 0 个汉 点 漶 合要扩展二级汉字字库以及非汉字图形字符等其 约 占 2 KB存 储量 。 8 他汉字字库, 可依照本文一级汉字的设计相应实 还可应用于 () 4控制 区。 用于指明点阵信 皂存储地址和句 现。此方案不但可用于单片机系统中, 子长度等信息 , 在汉字信息处理时使用。1 0 0 个句 任何无 中文系统支持的嵌入式系统中。根据这个 子 。 占 0 K , 以存 于 扩展 R M 中。 约 . B可 5 A 思路还可设计出不同字体 、 点阵混合的字库, 支持 字库区、 代码区、 点阵区和控制区构成了单片 包含 2万多个字符的新国标编码 ,甚至矢量字体 机汉字信息的存储机制。系统的数据流程是 : 系统 在单片机系统中的应用也成为可能。 根据代码区内容生成控制区数据,同时将代码转 责任 编辑 : 帆 杨 换成字库 区地址并读 出汉字点阵信息存 人点 阵
一种Microwindows的汉字输入法

软件 设 计
该 汉 字 输 入 法 程 序 是 一 个
输 出等 ,通过 调 用 底 层 设 备驱 动程 烦 。若 是 用程 序 来 实 现 ,则 比较 灵 Na oX程 序 , 序 结 构 如 图 1 示 。 n— 程 所
序 向上层 提供 服 务 ;最 上层 提 供 了 活 , 容 易 维 护 , 需 要屏 蔽 Na o 也 它 n.
O O xd
描
述
的 处 理 等 ;销 毁 指 定 的 字 体 、图 形
设 备 描 述 表 和 窗 口 ; 闭 与 Na oX 关 n— 服 务 器 的 连 接 ;退 出 应 用 程 序 。
输 入 法数量
回车
程 序 分为 输 入 法 管 理 程序 和 具
体 的 输入 法 程 序 ,二者 分 工 是不 同
首 先 建 立 与 Na o X服 务 器 的 n—
供 应 用 程 序 工 程 师 使 用 的 两 种 AP X 读 低层 键盘 驱 动 的功 能 ,用 一 个 连 接 ; 创 建 窗 口 和 所 有 需 要 的 资 I 接 口 ,分 别 是 同 Wid ws 于 消 息 应 用 程序 来 处理 应用 程 序与 Na ox 源 ,如 图形 设 备 描 述 表 、字 体 、绘 no 基 n. 循 环 的编 程 方 式 ( i r wi d ws 进 行 键 盘 事件 消 息 传递 ,从 而 实 现 图区 域 ;选 择 处 理 的事 件 类 型 ;进 M co n o AP ) 基 于 X— id ws C S方 式 汉 字 的输 入 。本 文 重 点 介绍 应 用 程 I和 W no 的 / ( n — I。 Na oX AP) 本 设 计 是在 L n x]务 器 / 户 iu /  ̄ 客 序处理方法。
单片机中文拼音输入法的设计及实现

单片机中文拼音输入法的设计及实现
柏琳;丁维明
【期刊名称】《工业控制计算机》
【年(卷),期】2005(18)7
【摘要】介绍单片机拼音输入法,由单片机采用折半查找算法定位其在"拼音-首汉字位移表"中的位置,检出对应的首汉字位移,映射按拼音排序的"汉字内码表",根据其内码计算出其字模在"字模表"中位置,并将字模检出送至LCD显示.
【总页数】3页(P48-49,51)
【作者】柏琳;丁维明
【作者单位】东南大学动力工程系,210096;东南大学动力工程系,210096
【正文语种】中文
【中图分类】TP3
【相关文献】
1.浅谈单片机中文输入法系统的设计与实现 [J], 王鹏
2.嵌入式系统下中文拼音输入法的设计与实现 [J], 李晨
3.手机中文拼音输入法的设计与实现 [J], 曲卫华
4.基于QT_E的嵌入式软键盘和中文拼音输入法的设计与实现 [J], 吴静;叶桦;林志勇;;;
5.应用于低性能单片机的拼音输入法设计与实现 [J], 王江;李丽英;刘明德
因版权原因,仅展示原文概要,查看原文内容请购买。
汉字联机手写识别系统的设计与实现

s e pe d,a mpr v d n — ln a dwrte Ch n s h r ce e o i o y t m s pr p s d. Fis , ea tc ,es i g ni oe o ie h n itn i e e c a a trr c g t n s se i o o e n i rt lsi m h n
论上介绍并分析 了弹性网格识别算法 和笔顺识别算法 , 接着将两种识 别算法 的优点 进行有机组合 , 采用最小二乘 法对输 入
的笔划进行线性拟合。算法在嵌入式 l u i x下进行仿真设 计并得 到了实现 , n 通过对仿真结果 的分析 , 明了结合后 的改进算 证
法达 到了提高手写识别率和识别 速率 。所采用 的方法对汉字手写体识别的研究有一定的借鉴和指导作用 。
第2 卷 第9 7 期
文 章 编 号 :0 6—94 ( 00)9—04 0 10 3821 0 25— 4
计
算
机
仿
真
21年9 0 0 月
汉 字ቤተ መጻሕፍቲ ባይዱ 机 手 写识 别 系统 的设 计 与 实现
胡 石 根 , 以 勤 陆
( 华南理工大学电子与信息学院 , 广东 广州 5 04 160) 摘 要: 针对嵌入式手写识别系统存 在识别率低 、 识别速率慢 的缺点 。研究 了一种 汉字联机手写识别 的改进算 法。首先从 理
应用于低性能单片机的拼音输入法设计与实现

1引言随着嵌入式系统应用领域的不断拓展[1],越来越多的嵌入式设备要求实现中文汉字的输入与显示。
目前应用于智能终端最为广泛的是美国特捷通讯的T9输入法,其次有Mo-torola 的iTAP 输入法和Ericson 的字能输入法等[2]。
尽管市场上还有许多输入法,且它们的功能也十分强大,但是它们大多对硬件要求较高,几乎不支持没有操作系统的嵌入式产品。
而在低端市场,单片机往往需要花费大部分资源来完成输入法功能,这不免导致系统主功能缺少足够的资源可供调用,出现头重脚轻的状况。
因此,研究一种实用且低成本的中文输入法是非常有市场前景和必要性的。
2设计思路单片机中的输入法的传统思路是:选用较大容量的EE-PROM 存放汉字字库,汉字内码则装入FLASH 中,这样虽然可以实现输入法功能,但是其造成了主控芯片的资源大量浪费,FLASH 不能用来存放更多的系统功能代码。
而后,虽然出现了带字库的LCD ,但其做法大都是选择具有较大程序存储器的微处理器,以便存储拼音到字型码的映射表,这样虽然可以解决FLASH 不足的问题,但是成本大幅提高,产品竞争力将随之下降。
本文的设计思路是:采用已附带汉字字库的点阵液晶,直接略去字库所需的内存;然后将汉字内码保存到EEPROM ,而内码大小远小于相应的字库内容,在此处我们可以节省出大量空间。
主控只需要在拼音与内码之间建立一种对应关系,最后通过键盘选择要输入的汉字并显示在液晶屏上。
3硬件设计本系统按功能可划分为输入、处理、存储和输出四个部分[3]。
对于拼音输入法来说,至少需要实现26个字母键、10个数字键、ESC 键、OK 键、MENU 键、MODE 键、UP 键和DOWN 键,可以自制或选择标准键盘。
处理器选用NXP 的LPC2103芯片,它的最高工作速度可达70MHz ,拥有32KB 的片内FLASH 程序存储器和8K 的片内SRAM [4],能够满足大部分嵌入式系统的需求[5],特别适用于访问控制和指纹打卡机等小型应用中,如果在该芯片上开发输入法,作者经过实验测试得到以下结论:使用传统方法时片内FLASH 和RAM 均存在内存不够的问题,改进方案是去掉字模部分,引入带字模的液晶显示器,这样就节约了大量的主控芯片的FLASH 空间,但由于字库内码仍然存放在RAM 中,LPC2103的RAM 依然不足,所以这里采用24c256作为存储器,搭配以ST7920为控制器的液晶,最后发现完成输入法功能后,系统仅使用了主控3KByte FALSH,4KByte RAM ,使得存储量小的主控也能胜任调整后的拼音输入法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/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)这个文件中,有许多词组,是我们不需要的,需要剔掉,但手工的方式工作量太大,这里我们发挥计算机比较傻的优势来做这件事,用到一些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)3.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)为了方便,做进一步的整理,将一个段位的所有字放到一行中:啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑北辈背贝钡倍狈备惫焙被奔苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛鞭边编贬扁便变卞辨辩辫遍标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳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)3.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, 下载次数: 833.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)最后,就是再整理了,/* 按照数字的顺序重新排列数据 */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);write_file.WriteString(str9);目的是将拼音按数字顺序重新排列,以加快搜索速度{"2","a",(char *)PY_mb_a},{"2","b",(char *)PY_mb_bu},{"2","c",(char *)PY_mb_ca},{"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},{"26","bo",(char *)PY_mb_bo},{"28","bu",(char *)PY_mb_bu},{"22","ca",(char *)PY_mb_ca},{"23","ce",(char *)PY_mb_ce},{"24","ci",(char *)PY_mb_ci},{"28","cu",(char *)PY_mb_cu},{"264","ang",(char *)PY_mb_ang},{"224","bai",(char *)PY_mb_bai},{ final-1.rar (2.28 KB)final-2.rar (2.44 KB)最后,就是按照输入的数字顺序,遍历数组,得到相应的拼音和汉字串,我就不多啰嗦了,明天到单位,我把真实的终端拍个照片发上来给大家看一下。