当前所在位置:珠峰网资料 >> 计算机 >> 计算机等级考试 >> 正文
用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环境下运行通过
 
广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved