明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

用Foxpro制作Windows輸入法碼表

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

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


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


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

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

自 動(dòng) 生 成Windows 的 碼 表 文 件 。 由 于 在 生 成 碼 表 文 件 時(shí) 就 已 對(duì) 編 碼 做 了 排 序 處 理 , 因 而 無(wú) 需Windows 的 碼 表 編 譯 器 再 排 序(Sort=0) , 從 而 不 但 省 去 了 費(fèi) 時(shí) 的 排 序 過(guò) 程 , 而 且 使 編 碼 數(shù) 目 幾 乎 沒(méi) 有 限 制 。
一 、 程 序 說(shuō) 明
本 程 序 涉 及 的 庫(kù) 文 件 結(jié) 構(gòu) 為:

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


程 序 運(yùn) 行 之 前 , 需 制 作 兩 個(gè) 庫(kù) 文 件:" 單 字.DBF" 和" 字 碼.DBF" 。 " 單 字.DBF" 存 放 每 個(gè) 漢 字 的 一 、 二 、 三 、 四 級(jí) 五 筆 字 型 編 碼 。" 單 字.DBF" 可 以 從 其 他 漢 字 系 統(tǒng) 的 五 筆 字 型 碼 表 文 件 中 取 得 。 將 取 得 的 單 個(gè) 漢 字 及 其 編 碼 添 加 到" 單 字.DBF" 即 可 。


" 字 碼.DBF" 中 的Word 字 段 是6850 個(gè) 漢 字 ,Code 字 段 是 每 個(gè) 漢 字 五 筆 字 型 編 碼 的 前 二 碼 。" 字 碼.DBF" 可 以 利 用" 單 字.DBF" 制 作: 先 刪 除 其 中 的 一 級(jí) 簡(jiǎn) 碼, 再 取 得 每 個(gè) 漢 字 和 其 編 碼 的 前 兩 碼, 最 后 刪 除 相 同 的 記 錄 。

二 、 運(yùn) 行 過(guò) 程
1. 運(yùn) 行 程 序 的 第 一 步 , 將 要 增 加 的 詞 組 文 本 文 件&AppFile..txt 增 補(bǔ) 到 庫(kù) 文 件&AppDBFile..dbf 的Word 字 段 中;

2. 調(diào) 用 過(guò) 程DelExistWord 刪 除 庫(kù) 文 件&AppDBFile..dbf 中 與 詞 組 庫(kù) 文 件" 詞 組 庫(kù).dbf" 重 復(fù) 的 記 錄 , 以 保 證 增 加 時(shí) 不 會(huì) 重 復(fù) 加 入" 詞 組 庫(kù).dbf" 中 已 有 的 詞 組;


3. 調(diào) 用 過(guò) 程Generate_WBCode 生 成 庫(kù) 文 件&AppDBFile..dbf 中Code 字 段 的 五 筆 字 型 編 碼 。 首 次 運(yùn) 行 時(shí) , 本 程 序 將 生 成 庫(kù) 文 件" 詞 組 庫(kù).dbf" , 以 后 運(yùn) 行 時(shí) , 會(huì) 把 欲 增 加 的 詞 組 及 其 編 碼 增 補(bǔ) 到 庫(kù) 文 件" 詞 組 庫(kù).dbf" 中 。 在 生 成 編 碼 時(shí) 要 用 到 庫(kù) 文 件" 字 碼.dbf" 及 其 關(guān) 于Word 字 段 的 索 引 文 件" 字 碼.cdx";


4. 調(diào) 用 過(guò) 程ToWinForm 生 成Windows 碼 表 文 件 。 運(yùn) 行 中 用" 單 字.dbf" 和" 詞 組 庫(kù).dbf" 合 成 所 有 漢 字 、 詞 組 的 編 碼 庫(kù) 文 件MBase.dbf 并 生 成 其 索 引 文 件MBase.cdx 。 最 后 由MBase.bdf 生 成Windows 的 碼 表 文 件" 五 筆 字 型.txt" 。

三 、 程 序 清 單
Set Talk Off
Set Notify Off
Clear
* 將此程序所在路徑設(shè)為默認(rèn)路徑
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('詞組庫(kù).DBF')
Set Message To "刪除與'詞組庫(kù).DBF'重復(fù)的詞組"
Do DelExistWord
EndIf
Set Message To '正在生成編碼'
Do Generate_WBCode
If File('詞組庫(kù).DBF')
Set Message To '增補(bǔ)到詞組庫(kù)并重新索引'
Use詞組庫(kù)
Append From &AppDBFile
Else
Set Message To '建立詞組庫(kù)和其索引'
Copy File &AppDBFile To詞組庫(kù).DBF
Use詞組庫(kù)
Index On code Tag code
Index On Word Tag Word Of詞組庫(kù)
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
* ******** 子過(guò)程 ***********
&&檢查是否和'詞組庫(kù).DBF'有重碼
Procedure DelExistWord
Select 0
Use詞組庫(kù)
Set Order to Word
Select App
Set Relation To Word Into詞組庫(kù)
Go Top
Do While .Not.Eof('App')
IF .Not.Eof('詞組庫(kù)')
Delete
EndIf
Skip
EndDo
Pack
Select詞組庫(kù)
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詞組庫(kù)
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
該 程 序 使 用 的 機(jī) 器 為386DX33,4M , 在Foxpro For Windows2.5b 環(huán) 境 下 運(yùn) 行 通 過(guò) 。