[摘要]摘 要: 本 文 介 绍 了 一 种 制 作Windows 汉 字 输 入 法 码 表 的 方 法 , 其 特 点 是 自 动 生 成 编 码 及 码 表 文 件 。 关 键 词: 码 表 生 成 器 、 码 表 编 译 、 排 序 、 词 组 文 本 文 件 、 词 组 库 文 件 、Win...
摘 要: 本 文 介 绍 了 一 种 制 作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 环 境 下 运 行 通 过 。
……