美图欣赏 | 设为首页 | 加入收藏 | 网站地图

当前位置:电脑中国 > 编程 > VFP教程 >

vfp教程之用Foxpro制作Windows输入法码表

2020-01-17 11:23|来源:未知 |作者:dnzg |点击:
摘   要: 本 文 介 绍 了 一 种 制 作Windows 汉 字 输 入 法 码 表 的 方 法 , 其 特 点 是 自 动 生 成 编 码 及 码 表 文 件 。 
关 键 词: 码 表 生 成 器 、 码 表 编 译 、 排 序 、 词 组 文 本 文 件 、 词 组 库 文 件 、Windows 码 表 文 件 。 
Windows 的 码 表 生 成 器 为 人 们 提 供 了 自 制 汉 字 输 入 法 的 手 段 , 但 在 编 译 前 需 做 大 量 的 预 备 工 作 , 在 实 际 操 作 过 程 中 存 在 着 以 下 三 方 面 的 问 题 , 现 以 制 作 五 笔 字 型 输 入 法 为 例 加 以 分 析: 

1. 格 式 问 题   我 们 虽 然 能 从 许 多 汉 字 系 统 中 取 得 五 笔 字 型 码 表, 但 这 些 码 表 格 式 很 少 与Windows 码 表 格 式 相 同, 因 此 在 用 码 表 生 成 器 编 译 前 需 进 行 格 式 调 整; 


2. 编 码 问 题   从 任 何 一 个 汉 字 系 统 都 只 能 得 到 数 量 有 限 的 词 条 , 因 此 我 们 有 必 要 根 据 需 要 自 建 词 组 , 或 把 非 五 笔 字 型 输 入 法( 如Windows3.2 中 的 郑 码) 中 大 量 的 词 组 增 加 到 五 笔 字 型 输 入 法 中 , 而 为 这 些 词 组 逐 一 人 工 编 码 既 费 时 又 易 错; 


3. 编 译 限 制  Windows 中 的 码 表 生 成 器 在 对 没 有 按 编 码 排 序 的 码 表 文 件 编 译 时 需 要 排 序 , 但 这 时 它 能 实 际 接 受 的 最 大 编 码 数 为16000 条 左 右 , 超 过 的 部 分 则 无 法 处 理 , 而 且 排 序 时 间 较 长 。 针 对 上 述 问 题 , 我 用Foxpro 编 制 了 一 段 程 序 , 能 较 满 意 地 解 决 以 上 问 题 , 其 特 点 为: 

自 动 生 成 编 码 。 只 需 从 任 一 汉 字 输 入 法 中 提 取 词 组 并 舍 去 其 编 码 , 再 不 需 做 任 何 格 式 调 整 , 这 样 我 们 就 会 有 众 多 词 组 源 可 以 利 用 。 

自 动 生 成Windows 的 码 表 文 件 。 由 于 在 生 成 码 表 文 件 时 就 已 对 编 码 做 了 排 序 处 理 , 因 而 无 需Windows 的 码 表 编 译 器 再 排 序(Sort=0) , 从 而 不 但 省 去 了 费 时 的 排 序 过 程 , 而 且 使 编 码 数 目 几 乎 没 有 限 制 。 
一 、 程 序 说 明 
本 程 序 涉 及 的 库 文 件 结 构 为: 

Field Field Name Type Width Dec 
1 CODE Character 4 
2 WORD Character 22 


程 序 运 行 之 前 , 需 制 作 两 个 库 文 件:" 单 字.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" 。 

三 、 程 序 清 单 
Set Talk Off 
Set Notify Off 
Clear 
* 将此程序所在路径设为默认路径 
ProgPath=Substr(SYS(16),1,RAT('\',SYS(16))-1) 
Set Default To &ProgPath 
AppFile = GetFile('TXT', '要增加的词组文件.TXT:', '选择') 
AppDBFile= Stuff(AppFile,AT('TXT',AppFile),3,'DBF') 
If File(AppDBFile) 
Delete File &AppDBFile 
EndIf 
Create &AppDBFile From Struc 
Use &AppDBFile Alias App 
Append From &AppFile Fields Word Deli 
Delete All For Len(alltrim(word))=0 
Pack 
If File('词组库.DBF') 
Set Message To "删除与'词组库.DBF'重复的词组" 
Do DelExistWord 
EndIf 
Set Message To '正在生成编码' 
Do Generate_WBCode 
If File('词组库.DBF') 
Set Message To '增补到词组库并重新索引' 
Use词组库 
Append From &AppDBFile 
Else 
Set Message To '建立词组库和其索引' 
Copy File &AppDBFile To词组库.DBF 
Use词组库 
Index On code Tag code 
Index On Word Tag Word Of词组库 
EndIf 
Use 
Delete File &AppDBFile 
Set Message To '正在生成Windows的码表文件' 
Do ToWinForm 
Set Message To 'Windows格式码表文件生成完毕!' 
Wait Window TimeOut 5 
Set Talk On 
Set Notify On 
Set Message To 
Return 
* ******** 子过程 *********** 
&&检查是否和'词组库.DBF'有重码 
Procedure DelExistWord 
Select 0 
Use词组库 
Set Order to Word 
Select App 
Set Relation To Word Into词组库 
Go Top 
Do While .Not.Eof('App') 
IF .Not.Eof('词组库') 
Delete 
EndIf 
Skip 
EndDo 
Pack 
Select词组库 
Use 
Return 

&&生成五笔字型编码 
Procedure Generate_WBCode 
Private WBCode,WordString,WordLength,I 
Select 0 
Use字码 Order Tag Word of字码 
Select App 
Goto Top 
Do While .Not.Eof('App') 
WBCode='' 
WordString=Word 
WordLength=Len(AllTrim(WordString)) 
Select字码 
Do Case 
Case WordLength=4 
For I=1 TO 2 
ZI=SubStr(WordString,2*I-1,2) 
Find &ZI 
WBCode=WBCode+Code 
Next 
Case WordLength=6 
For I=1 TO 3 
ZI=SubStr(WordString,2*I-1,2) 
Find &ZI 
Do Case 
Case I=1 .OR. I=2 
WBCode=WBCode+SubStr(Code,1,1) 
Case I=3 
WBCode=WBCode+Code 
EndCase 
Next 
Case WordLength=8 
For I=1 TO 4 
ZI=SubStr(WordString,2*I-1,2) 
Find &ZI 
WBCode=WBCode+SubStr(Code,1,1) 
Next 
Case WordLength>8 
For I=1 TO 3 
ZI=SubStr(WordString,2*I-1,2) 
Find &ZI 
WBCode=WBCode+SubStr(Code,1,1) 
Next 
ZI=SubStr(WordString,WordLength-1,2) 
Find &ZI 
WBCode=WBCode+SubStr(Code,1,1) 
EndCase 
Select App 
Replace Code With WBCode 
Skip 
EndDo 
Close Databases 
Return 

&&生成Windows格式码表文件 
Procedure ToWinForm 
Private Head,Word_Code,txt,i 

If File('MBase.DBF') 
Delete File MBase.DBF 
Delete File MBase.CDX 
EndIf 
Create MBase From Struc 
Append From单字 
Append From词组库 
Index On Code Tag Code Of Mbase 

Dimension MbHead[7] 
Dimension Word_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) 
For i=1 to 7 
= Fputs(txt,MbHead[i]) 
Next 
Goto Top 
Do While .Not.Eof() 
Scatter TO Word_Code 
Skip 
= Fputs(txt,AllTrim(Word_Code[2])+AllTrim(Word_Code[1])) 
EndDo 
Use 
=FClose(txt) 
Delete File MBase.DBF 
Delete File MBase.CDX 
Return 
该 程 序 使 用 的 机 器 为386DX33,4M , 在Foxpro For Windows2.5b 环 境 下 运 行 通 过 。
(责任编辑:dnzg)