社区
非技术区
帖子详情
谁知道笔画输入法的原理?就是通过横竖撇捺折选择字的算法
iicp_520
2008-09-17 11:39:41
谁知道笔画输入法的原理?就是通过横竖撇捺折选择字的算法
...全文
1638
3
打赏
收藏
谁知道笔画输入法的原理?就是通过横竖撇捺折选择字的算法
谁知道笔画输入法的原理?就是通过横竖撇捺折选择字的算法
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
hai040
2008-09-17
打赏
举报
回复
把所有字的笔画存成数据库,不知道有没有标准现成的
aaajj
2008-09-17
打赏
举报
回复
就是编码啊,直接查找
星羽
2008-09-17
打赏
举报
回复
汉字笔画组字原理
20年前,我提出“无字库汉字”,以后进一步认为“信息时代的汉字和中文信息处理的出路是:汉字植根于电脑的方法必须建立在笔画组字上”。近5年的实践证明:不要庞大的字库数据,只要50个笔画,就可由软件自动组出所有汉字。笔画组字的方法,虽已基本叙述在“无字库汉字演示和设计软件的使用说明”中,但没有突出组字的原理,也缺乏系统性。现在把我已达到的水平,集中陈述于下。
一、 汉字组织的三个层次
关于汉字的组织构造,虽有许多不同的表述,名称就繁多,但我只取笔画、字根和汉字三个层次,字根由笔画组成,汉字由字根组成。有些笔画可以成字,有些字根也可独立成字,称为独体字。合体字与独体字、字根一样,也可成为更复杂的汉字之组成部分,这时可平等地看作是“子字”。其中,如果有没参与字根组织的、孤立的笔画,也同样看作是“子字”,其作用与字根一样。一个字根也可成为更复杂的字根之组成部分,当然也可称为“子字根”,其作用将被看作与单一的笔画一样。
笔画。笔画数量少,不同作者的看法基本一致。但笔画名称略有出入,而且常有如“横折竖折横折竖钩(简称:横折折折钩)”这等长长的怪名称,我提议用“乃钩 ”“言折”之类简短形象的名字。其次是笔画的排序也常相左,参见我另一篇文章“汉字笔画表征求意见稿”,曾在网上进行投票,结果因参与的网友太少,没得出结论。不过这些与组字原理都关系不大。对于组字来说,是如何决定每个笔画在汉字应占的位置和大小,以及笔画在拉长或压扁时,保证笔画的粗细和形态(主要在首尾及转折处的笔锋)不变。我曾设想,笔画之下还有一级“元笔画”,电脑只要少量元笔画的数据,就可组出世界所有文字的字母和笔画。但目前还只能为每个汉字笔画设计轮廓数据,实际上,不同字体还要有不相同的数据。在轮廓线中间,起落笔及转折处,都另设一骨干点。骨干点组成的骨干线,在不同汉字中是要随它应占的空间不同而变形的(拉长或压扁),但轮廓点相对于与它最近的骨干点的相对距离是永远不变的,以此来保证笔画的粗细和形态特征。至于每个笔画应占的正确空间,由后面详述的“层积”理论按笔画的“线数”计算。每一笔画都有纵横两个方向的线数。“点”两个线数都为1(记为11),“竖点”的纵向线数增为 2(记为12),如下表第一行所示。
主笔画 线数 形状或例字 付笔画 线数 形状或例字
a点 11 主1 A竖点 12 心1
b横 31 一 B短横 21 王2
c竖 13 丨,上1 C短竖 12 川2
u横撇弯钩(耳钩)33 阝1 U横撇折折钩(扬钩)33 扬4
“横”的线数为31,“坚”的则为13。线数最大值是3,实际上2和3差别不大,仅表示在这方向可以伸展,而与线数1有别。上表仅列出文末附表1中的4 行,作为例子说明各项的意义:笔画名前的字母是代码,大写的是副笔。副笔与主笔形状相似,有时简直分不清,或者可以相互替代,在字根表中的笔画序列里就不分大小写了。这里只有a到y,共25种笔画,是按我现在的程序中使用的排序。因为大部分笔画没收在当前的字库中,我用例字后加数字来表示,例如“短横”的 “形状或例字”是“王2”,就是表示王字的第二笔。
字根。字根也被称作部件、字元等。这些名字以前是为了研究汉字字形输入法提出来的,不同输入法作者“切分”出来的字根也就千奇百怪,难以统一了。笔画组字用的字根,更要从便于组出所有汉字的角度来选择。文后附的字根表,是我现在用的936个字根,按笔画顺序排列。当前字库中没有的,则表示为:含有它的例字,再加上该字根起止笔画数字。例如第300号的“翅14”,是“翅”字第一到第四笔,其笔画组成与299号的“支”完全一样。之所以要增加300号字根就是为了便于组出这类左下包围字,对于输入法来说,当然是多余的。表中还列出了由字根组字要用到的结构码和笔画数。下面将着重说明结构码的意义。
二、 由字根组出汉字
——————结构码
我们从说明比较简单的如何由字根组成汉字开始。无字库技术确也是从此发轫的。1984年,我为只有18K内存的袖珍机编研汉字系统时,就是只用240个字根组出任意汉字的。原来绝大部分汉字是由字根左右并列形成的,其次是上下结构的字,更少的是各种包围结构。例如,左上包围嵌套结构的“广”字头,它后面的字根都要写在它的右下方,即向下向右缩进。我发现,绝大部分情况下,字根都是以其固有的结构方式参加组字,个别以别的形式组字时,只要加一个结构码就可以了。而字根本身不要特别的结构码,把结构特性相同的字根编码放在一起,程序就可知道属于那个范围的字根应有什么结构特性。
现在转到微机上,字根增加到936,组字是更方便和正确了,同时给每个字根以一个3位整数的结构码,更精确地描述它的组字特性。字根结构特性分三类10 种,百位数0——9指明它属那一种,另两位可作出精细的安排,对于嵌套结构,十位和个位数,分别指明X和Y方向缩进的程度。以下是对结构码的具体说明。
1、 左右结构类:结构码百位数为0,绝大部分末两位也为0。对于一些笔划很少的字根,组成结构复杂的汉字时,它们所占的位置太窄小,显现不出应有特性。可以用一个两位数,它除以10,就用来规定扩大它应占空间的倍数(应占空间是以笔画数分摊的)。
2、 上下结构类:结构码百位数为1,一般为100。有些字根底部中空,如“宀��”等,希望后续字根能升高写入其中空部分,末两位数用来规定后续笔画升到该字根内部的百分数。
3、 嵌套结构类:结构码百位数大于1,其后续笔画写入其内部。后续笔画占据的空间之边缘,离开嵌套字根边缘各有不同的距离。一般来说,如果上下两端或左右两边都有距离的话,是相等的。所以只要用一个数N(十位数)指定x方向离开十分之几,用一个个位数M指定y方向离开十分之几。而结构码是百位数L(整个结构码为LNM),它用来指明嵌套种类时,就已指明到底那几个方向是离开嵌套字根的边缘的,这些百位数分别是:
a. 左上包围(L=2):如“厥”字之“厂”、“扇”字之“户”等,左边离开N/10,上边离开M/10。
b. 右上包围(L=3):如“匍”字之“勹” 、“司”字之“�”等,右边离开N/10,上边离开M/10。
c. 上三包围(L=4):如“问”字之“门”、“同”字之“冂”等,左右都离开N/10,上边离开M/10。
d. 左三包围(L=5):如“医”字之“匚”、“匡”字之“匚”等,左边离开N/10,上下都离开M/10。
e. 下三包围(L=6):如“函”字之“凵”、“幽”字之“山”等,左右都离开N/10,下边离开M/10。
f. 左下包围(L=7):如“毯”字之“毛”、“翅”字之“支”等,左边离开N/10,下边离开M/10。
g. 走之包围(L=8):如“连”字之“辶”、“建”字之“廴”等,数据同f,但嵌套字根是最后写的。
h. 全包围(L=9):如“国”字之“囗”,“周”字之外框也可列入此类,左右都离开N/10,上下也都离开M/10。
走之包围(L=8)原来是属于左下包围(L=7)的,这样要先写走之,再写被包围的右上部分,不符合书写的笔顺。把它独立出来,只要把被包围的右上部分用圆括号括起来,就可移到前面,就符合笔顺要求了。但是,全包围之“囗”字,前两笔先写,最后才用一横封口,无论如何不能符合笔顺要求,若不改变原有计算笔顺的习惯,就要在由字根计算笔画排序时使用特别的程序。
加圆括号是组织汉字的一种手段。圆括号内的字根序列,与调用别的汉字一样,即是被看作子字的部分。子字与后面部分的关系是左右结构。如果要改为上下结构,其他非上下结构的字根要改为上下结构也一样,可在后面加结构符“:”。强迫字根改为左右结构的结构符是“””。强迫改为包围结构的结构符是“=”,它是全包围结构符,后面也可以附加数字。其他包围结构符不需要,但这种包围结构是需要的,特别是叠加对号∨错号×或加圈○时就要用到。
每个字根应占多少空间,现在还单纯由该字根笔画数计算。前面提到,这使只有2-3个笔画的偏旁占的位置太少。用结构码扩大几倍,并不是很好的解决办法,当其余笔画也很少时,又嫌占得太大了。似乎可以再使用线数来计算。另外,包围结构,不管被包围的笔画多少,向内缩进固定的空间,也不妥当,需要按被周围笔画多寡来改进。
三、 由笔画组出字根
——————层积理论
与字根各有特殊的组字特性可以利用不同,笔画之间,既可以左右并列,也可以上下叠加,还可以在不同部位相交错,不能确定一种笔画的主要结构特性。所以我们把所有笔画都看成是有同样的上下结构特性,而且一个笔画构成一个“层”。不同形态的笔画构成的层,厚度是不一样的,我们称之为线数,横、横钩的y方向的线数为1,而折钩、竖、斜钩等y方向的线数为3。汉字的笔画是从上到下,逐层书写的,如果笔画相交,就把它看成是从下层延伸到上面的层,与上层的笔画交错。笔画要向上延伸n线数,就在该笔画后面加上一个数字n,n超过9,就用两个以上数字的相加值。例如,短横B、长横b加上竖c再加数字1(Bbc1),就会组成“干”字。这整个字的纵向线数,是两个横的1,加上一个竖的3,共计5,程序按这总线数分配空间,两个横只占上部2/5弱,而竖笔的y向线度3则在横笔下面,另在长横之上延伸线度1,故显得头重脚轻。为此在长短横间插入2个空笔z2(z后的数字表示有几个空笔或该空笔占多少线数),变成Bz2bc3,则竖在长横上下都一样长,就好看了。
笔画码右边直接加数字,是表示该笔画所占的空间向上延伸,字形拉长了。没延伸时它原来应占的空间仍是它占据的。如果数字n前加一个*号,则表示它占据的是从上一层笔画的底部向上延n个线数,即它自己没有独立的层,整个字也不增加线数,完全是重叠的笔画。如Bzc*1b,它是个“工”字。竖笔c虽然原有纵向线数3,但它没有自己的空间,只在空笔z的空间里延伸1个线度。
组成左右结构的笔画,则必须放在方括号[ ]之内,它们只形成一个层。这个层内的诸笔画,后面可加不同的数字而向上延伸不同的高度。如果左边第一个笔画加*n,则整层将有同样的高度n,而且也是从上一层底部开始向上延伸,没有自己独立的空间,是一个重叠的层。笔画没有向上延伸不同高度时的左右结构层(包括重叠层),其中的笔画将有同一个高度,即有相同的纵向线数,数字等于其中线数最大者,线数较小的笔画自动伸长。同样,同一个字根或子字中,所有层的横向线数也是相同的。如果有一个层是左右结构的,随着该层中笔画的增加,横向线数必然增加,那么其他所有层的横向线数都增加到相同的数值。例如zbz[c*3c]是“艹”的笔画序列,横向线数是横b的 3,因为竖c的横向线数是1,层[c*3c]的横向线数本为2,也增为3了。而zbz[c*3ccc]是汉字“卌”,横向线数等于层[c*3ccc]的 4,横b的线数也增为4。但是线数只用来安排笔画的相对位置的。上面举的两个字的横b,虽然有不同的横向线数,但有同一个长度,它们都占一个字的宽度。实际上只使竖笔c在两个字中疏密不同,第一个字中,各占1/2(总线数为3,每笔伸展为1.5);第二个字中各占1/4(总线数为4,每笔保持原有值1)。
一个字根的笔画结构序列中,可以调用别的字根。方法是把被调用的字根号写到一对尖括号<>中。被调用的字根可称为子字根,是被当作一个普通笔画来看待的,这个特殊笔画具有的线数,就是该字根的总线数。子字根有自己的笔画结构序列,按原有的规律组成字形,只不过它已被压缩,被安置在母字根的一定位置中。“<字根号>”既然作为一般笔画看待,也可以在它后面加数字进行位置微调。有时我们还把一部分笔画用大括号{}括起来,也称为子字根,也当作一个笔画看待。
圆括号()内的笔画也是一个子字根,不过它有一点特殊作用,这个子字根要写到前一笔画(例如折弯钩、弯钩)的左下方,而且这笔画的线数会随子字线数的增加而增加。上一节组出汉字的字根序列里,也用圆括号表示子字。组成汉字的字根序列里是可以直接出现笔画序列的,程序会分辨出笔画序列,先组成临时的字根。不过在这些临时字根中,是不可以使用圆括号的,否则它会被看作是汉字的子字,而不会被看作是临时字根的子字根。
除方括号外,所有括弧内的笔画,都以上下结构开始,括弧也必须配对,只有方括号的右括号,有时可省。方括号内的笔画后面,可加“-n”或“+n”而使起笔点向左或向右移动n个线数,这用来调整笔画间的相互关系。调整笔画关系的方法还可以用空笔画z。因为向上向左延伸,都不能超过一个字的范围,所以要下面的笔画穿出顶部的横b,则这横上面要加适当的空笔zn,否则下面的笔画后加多么大的数字也没有用。这个数字要恰到好处,也不能过大。过大时,调试该字根本身时没有问题,而当调用该字根组汉字时,该字根的上面有其他笔画时,它就会冲到这些笔画层中。设计字根时,必须反覆试验,才可选定最合适的。
附表1:25*2个笔画表
主笔画 线数 形状或例字 付笔画 线数 形状或例字
a点 11 主1 A竖点 12 心1
b横 31 一 B短横 21 王2
c竖 13 丨,上1 C短竖 12 川2
d撇 33 丿,不2 D竖撇 23 川1
e捺 33 人2 E平捺 32 辶3
f横钩 32 买1 F长横钩 23 子1
g竖钩 23 寸2 G撇钩 33 乄1
h竖提 23 以1 H小竖提 23 卯2
i斜钩 33 戈2 I卧钩(心钩) 22 心2
j提 33 站4 J点提 22 氵3
k横折提(言提) 22 让2 K横折折(凹折) 22 凹2
l横折钩(同钩) 33 同2 L横弯钩(力钩) 22 力1
n竖折折钩(马钩)22 马2 N竖折折(鼎折) 22 鼎6
m横折 23 丑1 M短横折 23 夬1
o横三折(乃钩) 33 乃1 O横三折(凸折) 33 凸4
p竖折撇(专钩) 23 专3 P竖折撇 22 奊6
q竖折 33 断7 Q竖弯 22 甚9
r撇折(发折) 22 发1 R绞丝撇 22 乡1
s横撇(又撇) 33 又1 M短横撇 22 对1
t走之折 12 辶2 N横折折撇(建折) 23 建7
u横撇弯钩(耳钩)33 阝1 U横撇折折钩(扬钩)33 扬4
v撇点 23 巡1 V横折弯 22 殳2
w横斜钩(风钩) 33 风2 W横折弯钩(九钩)33 九2
x竖弯钩(儿钩) 33 儿2 X横撇弯钩(乙钩) 33 乙
y弯钩 23 犭2 Y直弯钩 23 子2
行业分类-设备装置-一种支持词组输入的手写
输入法
.zip
综上所述,一种支持词组输入的手写
输入法
是中文
输入法
领域的重要创新,它结合了手写识别技术与词组预测
算法
,通过智能化的方式,使用户能够更快速、准确地输入中文内容,大大提高了输入效率。文件中的“一种支持词组...
笔划
输入法
查找
算法
示例(Lua实现)
公司同事最近利用谷歌拼音
输入法
实现了自己的拼音
输入法
,经过了解,最核心的就是一个trie(词典树)的构造和检索(这里不太介绍trie树了,google一搜一大把),于是今天就想实现了一个笔划
输入法
。大概的想法是: ...
输入法
开发基础
输入法
开发最为重要的就是开发框架,它是
输入法
与系统中有输入焦点的应用之间连接的桥梁,将用户输入的文
字
传输到对应的应用中。 不同系统下
输入法
开发使用的框架不同,windows系统下使用的框架有: IMM-IME和TSF,...
「小狼毫」-- rimeime 中州韵
输入法
引擎
最近试用了Rime(中州韵
输入法
引擎)。用的是「小狼毫」(Weasel)朙月拼音。对于用惯搜狐/QQ/百度等
输入法
的普通用户来说,Rime可能...是从各种常见键盘
输入法
中提炼出来的抽象的输入
算法
框架。因为 Rime 涵盖了...
输入法
学习与比较
ContentsIntroduction...现在,连八十岁的爷爷都会用手机,会
输入法
了. 虽然对多数人来说,不需要要求有多快的速度,毕竟你不是淘宝客服~~ 可是手机聊天太慢会不会被人嫌弃?虽说微信可以发语音,可是语音的弊端显而易...
非技术区
15,446
社区成员
58,122
社区内容
发帖
与我相关
我的任务
非技术区
C/C++ 非技术区
复制链接
扫一扫
分享
社区描述
C/C++ 非技术区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章