用Foxpro制作Windows输入法码表
|
|
|
作者:佚名
来源:InterNet 加入时间:2005-1-31 |
摘 要: 本 文 介 绍 了 一 种 制 作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 环 境 下 运 行 通 过 。
[文章录入员:nancy] |
|
|
|
|