明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

用Foxpro制作Windows輸入法碼表

[摘要]摘   要: 本 文 介 紹 了 一 種 制 作Windows 漢 字 輸 入 法 碼 表 的 方 法 , 其 特 點 是 自 動 生 成 編 碼 及 碼 表 文 件 。 關 鍵 詞: 碼 表 生 成 器 、 碼 表 編 譯 、 排 序 、 詞 組 文 本 文 件 、 詞 組 庫 文 件 、Win...
摘   要: 本 文 介 紹 了 一 種 制 作Windows 漢 字 輸 入 法 碼 表 的 方 法 , 其 特 點 是 自 動 生 成 編 碼 及 碼 表 文 件 。
關 鍵 詞: 碼 表 生 成 器 、 碼 表 編 譯 、 排 序 、 詞 組 文 本 文 件 、 詞 組 庫 文 件 、Windows 碼 表 文 件 。
Windows 的 碼 表 生 成 器 為 人 們 提 供 了 自 制 漢 字 輸 入 法 的 手 段 , 但 在 編 譯 前 需 做 大 量 的 預 備 工 作 , 在 實 際 操 作 過 程 中 存 在 著 以 下 三 方 面 的 問 題 , 現(xiàn) 以 制 作 五 筆 字 型 輸 入 法 為 例 加 以 分 析:

1. 格 式 問 題   我 們 雖 然 能 從 許 多 漢 字 系 統(tǒng) 中 取 得 五 筆 字 型 碼 表, 但 這 些 碼 表 格 式 很 少 與Windows 碼 表 格 式 相 同, 因 此 在 用 碼 表 生 成 器 編 譯 前 需 進 行 格 式 調 整;


2. 編 碼 問 題   從 任 何 一 個 漢 字 系 統(tǒng) 都 只 能 得 到 數(shù) 量 有 限 的 詞 條 , 因 此 我 們 有 必 要 根 據(jù) 需 要 自 建 詞 組 , 或 把 非 五 筆 字 型 輸 入 法( 如Windows3.2 中 的 鄭 碼) 中 大 量 的 詞 組 增 加 到 五 筆 字 型 輸 入 法 中 , 而 為 這 些 詞 組 逐 一 人 工 編 碼 既 費 時 又 易 錯;


3. 編 譯 限 制  Windows 中 的 碼 表 生 成 器 在 對 沒 有 按 編 碼 排 序 的 碼 表 文 件 編 譯 時 需 要 排 序 , 但 這 時 它 能 實 際 接 受 的 最 大 編 碼 數(shù) 為16000 條 左 右 , 超 過 的 部 分 則 無 法 處 理 , 而 且 排 序 時 間 較 長 。 針 對 上 述 問 題 , 我 用Foxpro 編 制 了 一 段 程 序 , 能 較 滿 意 地 解 決 以 上 問 題 , 其 特 點 為:

自 動 生 成 編 碼 。 只 需 從 任 一 漢 字 輸 入 法 中 提 取 詞 組 并 舍 去 其 編 碼 , 再 不 需 做 任 何 格 式 調 整 , 這 樣 我 們 就 會 有 眾 多 詞 組 源 可 以 利 用 。

自 動 生 成Windows 的 碼 表 文 件 。 由 于 在 生 成 碼 表 文 件 時 就 已 對 編 碼 做 了 排 序 處 理 , 因 而 無 需Windows 的 碼 表 編 譯 器 再 排 序(Sort=0) , 從 而 不 但 省 去 了 費 時 的 排 序 過 程 , 而 且 使 編 碼 數(shù) 目 幾 乎 沒 有 限 制 。
一 、 程 序 說 明
本 程 序 涉 及 的 庫 文 件 結 構 為:

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


程 序 運 行 之 前 , 需 制 作 兩 個 庫 文 件:" 單 字.DBF" 和" 字 碼.DBF" 。 " 單 字.DBF" 存 放 每 個 漢 字 的 一 、 二 、 三 、 四 級 五 筆 字 型 編 碼 。" 單 字.DBF" 可 以 從 其 他 漢 字 系 統(tǒng) 的 五 筆 字 型 碼 表 文 件 中 取 得 。 將 取 得 的 單 個 漢 字 及 其 編 碼 添 加 到" 單 字.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 環(huán) 境 下 運 行 通 過 。