摘 要: 本 文 介 紹 了 一 種 制 作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ì) 沒 有 按 編 碼 排 序 的 碼 表 文 件 編 譯 時(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ù) 目 幾 乎 沒 有 限 制 。 一 、 程 序 說(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ò) 。
|