用Foxpro编写Windows输入法码表
发布时间:2010/6/30 10:40:04 来源:城市学习网 编辑:ziteng
Windows的码表生成器为人们提供了自制汉字输入法的手段,但在编译前需做大量的预备工作,在实际操作过程中存在着以下三方面的问题,现以制作五笔字型输入法为例加以分析:
1.格式问题 我们虽然能从许多汉字系统中取得五笔字型码表,但这些码表格式很少与Windows码表格式相同,因此在用码表生成器编译前需进行格式调整;
2.编码问题 从任何一个汉字系统都只能得到数量有限的词条,因此我们有必要根据需要自建词组,或把非五笔字型输入法(如Windows3.2中的郑码)中大量的词组增加到五笔字型输入法中,而为这些词组逐一人工编码既费时又易错;
3.编译限制 Windows中的码表生成器在对没有按编码排序的码表文件编译时需要排序,但这时它能实际接受的最大编码数为16000条左右,超过的部分则无法处理,而且排序时间较长。针对上述问题,我用Foxpro编制了一段程序,能较满意地解决以上问题,其特点为:
自动生成编码。只需从任一汉字输入法中提取词组并舍去其编码,再不需做任何格式调整,这样我们就会有众多词组源可以利用。
自动生成Windows的码表文件。由于在生成码表文件时就已对编码做了排序处理,因而无需Windows的码表编译器再排序(Sort=0),从而不但省去了费时的排序过程,而且使编码数目几乎没有限制。
一、程序说明
本程序涉及的库文件结构为:
FieldFieldNameTypeWidthDec
1CODECharacter4
2WORDCharacter22
程序运行之前,需制作两个库文件:"单字.DBF"和"字码.DBF"。"单字.DBF"存放每个汉字的一、二、三、四级五笔字型编码。"单字.DBF"可以从其他汉字系统的五笔字型码表文件中取得。将取得的单个汉字及其编码添加到"单字.DBF"即可。
"字码.DBF"中的Word字段是6850个汉字,Code字段是每个汉字五笔字型编码的前二码。"字码.DBF"可以利用"单字.DBF"制作:先删除其中的一级简码,再取得每个汉字和其编码的前两码,最后删除相同的记录。
二、运行过程
1.运行程序的第一步,将要增加的词组文本文件&AppFile..txt增补到库文件&AppDBFile..dbf的Word字段中;
2.调用过程DelExistWord删除库文件&AppDBFile..dbf中与词组库文件"词组库.dbf"重复的记录,以保证增加时不会重复加入"词组库.dbf"中已有的词组;
3.调用过程Generate_WBCode生成库文件&AppDBFile..dbf中Code字段的五笔字型编码。首次运行时,本程序将生成库文件"词组库.dbf",以后运行时,会把欲增加的词组及其编码增补到库文件"词组库.dbf"中。在生成编码时要用到库文件"字码.dbf"及其关于Word字段的索引文件"字码.cdx";
4.调用过程ToWinForm生成Windows码表文件。运行中用"单字.dbf"和"词组库.dbf"合成所有汉字、词组的编码库文件MBase.dbf并生成其索引文件MBase.cdx。最后由MBase.bdf生成Windows的码表文件"五笔字型.txt"。
三、程序清单
SetTalkOff
SetNotifyOff
Clear
*将此程序所在路径设为默认路径
ProgPath=Substr(SYS(16),1,RAT(’’,SYS(16))-1)
SetDefaultTo&ProgPath
AppFile=GetFile(’TXT’,’要增加的词组文件.TXT:’,’选择’)
AppDBFile=Stuff(AppFile,AT(’TXT’,AppFile),3,’DBF’)
IfFile(AppDBFile)
DeleteFile&AppDBFile
EndIf
Create&AppDBFileFromStruc
Use&AppDBFileAliasApp
AppendFrom&AppFileFieldsWordDeli
DeleteAllForLen(alltrim(word))=0
Pack
IfFile(’词组库.DBF’)
SetMessageTo"删除与’词组库.DBF’重复的词组"
DoDelExistWord
EndIf
SetMessageTo’正在生成编码’
DoGenerate_WBCode
IfFile(’词组库.DBF’)
SetMessageTo’增补到词组库并重新索引’
Use词组库
AppendFrom&AppDBFile
Else
SetMessageTo’建立词组库和其索引’
CopyFile&AppDBFileTo词组库.DBF
Use词组库
IndexOncodeTagcode
IndexOnWordTagWordOf词组库
EndIf
Use
DeleteFile&AppDBFile
SetMessageTo’正在生成Windows的码表文件’
DoToWinForm
SetMessageTo’Windows格式码表文件生成完毕!’
WaitWindowTimeOut5
SetTalkOn
SetNotifyOn
SetMessageTo
Return [NextPage] *********子过程***********
&&检查是否和’词组库.DBF’有重码
ProcedureDelExistWord
Select0
Use词组库
SetOrdertoWord
SelectApp
SetRelationToWordInto词组库
GoTop
DoWhile.Not.Eof(’App’)
IF.Not.Eof(’词组库’)
Delete
EndIf
Skip
EndDo
Pack
Select词组库
Use
Return
&&生成五笔字型编码
ProcedureGenerate_WBCode
PrivateWBCode,WordString,WordLength,I
Select0
Use字码OrderTagWordof字码
SelectApp
GotoTop
DoWhile.Not.Eof(’App’)
WBCode=’’
WordString=Word
WordLength=Len(AllTrim(WordString))
Select字码
DoCase
CaseWordLength=4
ForI=1TO2
ZI=SubStr(WordString,2*I-1,2)
Find&ZI
WBCode=WBCode+Code
Next
CaseWordLength=6
ForI=1TO3
ZI=SubStr(WordString,2*I-1,2)
Find&ZI
DoCase
CaseI=1.OR.I=2
WBCode=WBCode+SubStr(Code,1,1)
CaseI=3
WBCode=WBCode+Code
EndCase
Next
CaseWordLength=8
ForI=1TO4
ZI=SubStr(WordString,2*I-1,2)
Find&ZI
WBCode=WBCode+SubStr(Code,1,1)
Next
CaseWordLength>8
ForI=1TO3
ZI=SubStr(WordString,2*I-1,2)
Find&ZI
WBCode=WBCode+SubStr(Code,1,1)
Next [NextPage] ZI=SubStr(WordString,WordLength-1,2)
Find&ZI
WBCode=WBCode+SubStr(Code,1,1)
EndCase
SelectApp
ReplaceCodeWithWBCode
Skip
EndDo
CloseDatabases
Return
&&生成Windows格式码表文件
ProcedureToWinForm
PrivateHead,Word_Code,txt,i
IfFile(’MBase.DBF’)
DeleteFileMBase.DBF
DeleteFileMBase.CDX
EndIf
CreateMBaseFromStruc
AppendFrom单字
AppendFrom词组库
IndexOnCodeTagCodeOfMbase
DimensionMbHead[7]
DimensionWord_Code[2]
MbHead[1]=’[Description]’
MbHead[2]=’Name=五笔字型’
MbHead[3]=’MaxCodes=4’
MbHead[4]="UsedCodes=’abcdefghijklmnopqrstuvwxy"
MbHead[5]=’WildChar=z’
MbHead[6]=’Sort=0’
MbHead[7]=’[text]’
MBText=’五笔字型.txt’
txt=FCreate(MBText)
Fori=1to7
=Fputs(txt,MbHead[i])
Next
GotoTop
DoWhile.Not.Eof()
ScatterTOWord_Code
Skip
=Fputs(txt,AllTrim(Word_Code[2])+AllTrim(Word_Code[1]))
EndDo
Use
=FClose(txt)
DeleteFileMBase.DBF
DeleteFileMBase.CDX
Return
该程序使用的机器为386DX33,4M,在FoxproForWindows2.5b环境下运行通过