機內碼國標碼區位碼
計算機處理漢字信息的前提條件是對每個漢字進行編碼,這些編碼統稱爲漢字編碼。漢字信息在系統內傳送的過程就是漢字編碼轉換的過程。
漢字交換碼:漢字信息處理系統之間或通信系統之間傳輸信息時,對每一個漢字所規定的統一編碼,我國已指定漢字交換碼的國家標準“信息交換用漢字編碼字符集——基本集”,代號爲GB 2312—80,又稱爲“國標碼”。
國標碼:所有漢字編碼都應該遵循這一標準,漢字機內碼的編碼、漢字字庫的設計、漢字輸入碼的轉換、輸出設備的漢字地址碼等,都以此標準爲基礎。GB 2312—80就是國標碼。該碼規定:一個漢字用兩個字節表示,每個字節只有7位,與ASCII碼相似。
區位碼:將GB 2312—80的全部字符集組成一個94×94的方陣,每一行稱爲一個“區”,編號爲0l~94;每一列稱爲一個“位”,編號爲0l~94,這樣得到GB 2312—80的區位圖,用區位圖的位置來表示的漢字編碼,稱爲區位碼。
機內碼:爲了避免ASCII碼和國標碼同時使用時產生二義性問題,大部分漢字系統都採用將國標碼每個字節高位置1作爲漢字機內碼。這樣既解決了漢字機內碼與西文機內碼之間的二義性,又使漢字機內碼與國標碼具有極簡單的對應關係。
漢字機內碼、國標碼和區位碼三者之間的關係爲:區位碼(十進制)的兩個字節分別轉換爲十六進制後加20H得到對應的國標碼;機內碼是漢字交換碼(國標碼)兩個字節的最高位分別加1,即漢字交換碼(國標碼)的兩個字節分別加80H得到對應的機內碼;區位碼(十進制)的兩個字節分別轉換爲十六進制後加A0H得到對應的機內碼。
GB2312編碼包括符號、數字、字母、日文、製表符等,當然最主要的部分還是中文,它採用16位編碼方式,簡體中文的編碼範圍從B0A1一直到F7FE,完整編碼表可以參考http://ash.jp/code/cn/gb2312tbl.htm。
漢字編碼簡明對照表
中文轉換爲完整拼音算法原理分析
漢字編碼原理
1.國家標準漢字代碼體系
漢字字數繁多,屬性豐富,因而漢字代碼體系也較複雜,包括:
(1)漢字機內碼。它們是漢字在計算機漢字系統內部的表示方法,是計算機漢字系統
的基礎代碼。
(2)漢字交換碼。它們是國標漢字(如機內碼)進行信息交換的代碼標準。
(3)漢字輸入碼。它們是在計算機標準鍵盤上輸入漢字用到的各種代碼體系。
(4)漢字點陣碼。它們是在計算機屏幕上顯示和在打印機上打印輸出漢字的代碼體系。
(5)漢字字形控制碼。爲了打印各種風格的字體和字形所制定的代碼。
這些代碼系統有的必須有統一的國家標準,有的則不要求統一。近年來我國已經制定
系列漢字信息處理方面的國家標準,今後將繼續完善,並與國際上求得統一。
2. 國家標準漢字交換碼
我國制定了“中華人民共和國國家標準信息交換漢字編碼”,標準代號爲GB2312—80,
這種編碼又稱爲國標碼。在國標碼的字符集中共收錄了一級漢字3755個,二級漢字3008
個,圖形符號682個,三項字符總計7445個。
在國標GD2312—80中規定,所有的國標漢字及符號分配在一個94行、94列的方陣中,
方陣的每一行稱爲一個“區”,編號爲01區到94區,每一列稱爲一個“位”,編號爲01
位到94位,方陣中的每一個漢字和符號所在的區號和位號組合在一起形成的四個阿拉伯
數字就是它們的“區位碼”。區位碼的前兩位是它的區號,後兩位是它的位號。用區位碼
就可以唯一地確定一個漢字或符號,反過來說,任何一個漢字或符號也都對應着一個唯一
的區位碼。漢字“母”字的區位碼是3624,表明它在方陣的36區24位,問號“?”的區
位碼爲0331,則它在03區3l位。
所有的漢字和符號所在的區分爲以下四個組:
(1)01區到15區。圖形符號區,其中01區到09區爲標準符號區,10區到15區爲
自定義符號區。
01區到09區的具體內容如下;
1)01區。一般符號202個,如間隔符、標點、運算符、單位符號及製表符;
2)02區。序號60個,如1.~20.、(1)~(20)、①~⑩及(一)~(十);
3)03區。數字22個,如0—9及X一XII,英文字母52個,其中大寫A—Z、小寫
a—z各26個;
4)04區。日文平假名83個;
5)05區。日文片假名86個;
6)06區。希臘字母48個;
7)07區。俄文字母66個;
8)08區。漢語拼音符號a—z26個;
9)09區。漢語拼音字母37個。
(2)16區到55區。一級常用漢字區,包括了3755個一統漢字。這40個區中的漢字
是按漢語拼音排序的,同音字按筆劃順序排序。其中55區的90一94位未定義漢字。
(3)56區到87區。二級漢字區,包括了3008個二級漢字,按部首排序。
(4)88區到94區。自定義漢字區。
第10區到第15區的自定義符號區和第88區到第94區的自定義漢字區可由用戶自行
定義國標碼中未定義的符號和漢字。
3. 國家標準漢字機內碼
漢字的機內碼是指在計算機中表示一個漢字的編碼。機內碼與區位碼稍有區別。如上
所述,漢字區位碼的區碼和位碼的取值均在1~94之間,如直接用區位碼作爲機內碼,就
會與基本ASCII碼混淆。爲了避免機內碼與基本ASCII碼的衝突,需要避開基本ASCII碼
中的控制碼(00H~1FH),還需與基本ASCII碼中的字符相區別。爲了實現這兩點,可以
先在區碼和位碼分別加上20H,在此基礎上再加80H(此處“H”表示前兩位數字爲十六
進制數)。經過這些處理,用機內碼錶示一個漢字需要佔兩個字節,分別 稱爲高位字
節和低位字節,這兩位字節的機內碼按如下規則表示:
高位字節=區碼+20H+80H(或區碼+A0H)
低位字節=位碼+20H+80H(或位碼+AOH)
由於漢字的區碼與位碼的取值範圍的十六進制數均爲01H~5EH(即十進制的01~94),
所以漢字的高位字節與低位字節的取值範圍則爲A1H~FEH(即十進制的161~254)。
例如,漢字“啊”的區位碼爲1601,區碼和位碼分別用十六進制表示即爲1001H,它
的機內碼的高位字節爲B0H,低位字節爲A1H,機內碼就是B0A1H。
4. 漢字的輸入碼
在計算機標準鍵盤上,漢字的輸入和西文的輸入有很大的不同。西文的輸入,擊一次
鍵就直接輸入了相應的字符或代碼,“鍵入”和“輸入”是同一個含義。但是在計算機上
進行漢字輸入時,“鍵入”是指擊鍵的動作即鍵盤操作的過程,而“輸入”則是把所需的
漢字或字符送到指定的地方,是鍵盤操作的目的。目前已有多種漢字輸入方法,因此就有
多種漢字輸入碼。漢字輸入碼是面向輸入者的,使用不同的輸入碼其操作過程不同,但是
得到的結果是一樣的。不管採用何種輸入方法,所有輸入的漢字都以機內碼的形式存儲在
介質中,而在進行漢字傳輸時,又都以交換碼的形式發送和接收。
國標GB2312—80規定的區位碼和沿用多年的電報碼都可以作爲輸入碼。這類漢字編碼
和輸入碼是一一對應的,具有標準的性質,它們編碼用的字符是10個阿拉伯數字,每個
漢字的碼長均爲等長的四個數碼。
其他編碼的種類很多,可從以下幾點加以討論:
(2)編碼類型。可分爲拼音碼、字形碼、音形結合碼等類型。
(2)編碼規則。不同的編碼方案有很大的不同,有的規則簡單,學習起來較容易記憶,‘
有的規則複雜,較難記億。
(3)編碼字符集。有用字母鍵的,有用數字鍵的,有用字母鍵加數字鍵的,或者用了
更多的鍵作編碼字符集的。
(4)編碼長度。它與編碼字符集的大小有關,字符集越大,編碼長度越短。採用26
個字母的編碼,其碼長一般爲四位。
(5)對應關係。除上面提到的區位碼和電報碼爲一一對應的無重碼編碼外,其他現有
的編碼方案均有一定數量的重碼。所謂重碼即一碼對應多字。有許多編碼爲了增加輸入的
靈活性,同一漢字用多個碼來對應,例如雙音編碼。
(6)單寧和詞彙的編碼。現有的編碼方案,爲了提高效率,除了單字外還規定了詞彙
的編碼,甚至使用者可以自行增加詞彙庫中的詞彙,但在提高效率的同時也增加了記億和
操作的複雜性。
(7)碼錶的類型和大小。從漢字輸入碼到機內碼的轉換一股需要在機內檢索碼錶。如
果輸入碼和機內碼存在簡單的函數關係,有公式可以計算,如區位碼等編碼就不需要碼錶,
其他沒有簡單函數關係的編碼就需要碼錶。碼錶大小與數據結構、單字數量、詞彙數量等
因素有關。國標血2312—80規定的6763個一、二級漢字,備類編碼的碼錶從幾千字節到
幾萬字節。隨着詞彙旦的增加,有的碼錶達到了若干兆字節。
5. 漢字的點陣碼
漢字的顯示和輸出,普遍採用點陣方法。由於漢字數量多且字形變化大,對不同字形
漢字的輸出,就有不同的點陣字形。所謂漢字的點陣碼,就是漢字點陣字形的代碼。存儲
在介質中的全部漢字的點陣碼又稱爲字庫。 .
16x16點陣的漢字其點陣有16行,每一行上有16個點。如果每一個點用一個二進制
位來表示,則每一行有16個二進制位,需用兩個字節來存放每一行上的16個點,並且規
定其點陣中二進制位0爲白點,1爲黑點,這樣一個16X16點陣的漢字需要用2×t6即32
個字節來存放。依次類推,24×24點陣和32×32點陣的漢字則依次要用72個字節和128
個字節存放一個漢字,構成它在字庫中的字模信息。
要顯示或打印輸出一個漢字時,計算機漢字系統根據該漢字的機內碼找出其字模信息
在字庫中的位置,再取出其字模信息作爲字形在屏幕上顯示或在打印機上打印輸出。
嵌入式系統中文輸入法的設計
摘 要:在基於嵌入式系統的智能終端中,中文人機交互界面是必須的功能,某些系統還要求中文文本輸入。本文介紹了一種佔用較少資源並適於在MCU上實現的中文輸入法。
關鍵詞:嵌入式系統;中文輸入法;數字鍵盤
引言
目前,以LCD和數字鍵盤實現的人機交互式界面在智能終端中廣泛採用。在不同的應用場合,對人機界面的要求也不同,一些情況下只要求簡單參數的顯示和選擇,而在一些信息終端中,還要求文字的輸入。
在使用高性能CPU和標準顯示設備的情況下,實現友好的人機界面可採用商用嵌入式系統( 如Linux或WinCE)所支持的GUI程序。但很多情況下,智能終端使用MCU,且其顯示設備是非標準接口的小型LCD。此時,必須找到佔用較少資源的低成本實現方法。
筆者參加的智能終端項目就是一個比較典型的基於MCU的人機界面應用,使用128×64點陣式LCD模塊,要求可顯示Unicode編碼的一、二級常用漢字庫並可進行中文輸入。此應用中輸入法相關的代碼和數據佔用約20kB。在應用開發中,我們使用了實時操作系統μC/OS-II,相關內容可參考有關文獻。
簡單的中文拼音輸入法
漢字輸入法的實質是建立一種按鍵組合到漢字編碼的映射關係,因此,使用數字鍵盤的嵌入式系統的輸入法與使用標準鍵盤的PC機的輸入法沒有本質的不同,其區別主要在於嵌入式應用中處理器、存儲器等資源比較有限。如對應漢字“你”,拼音輸入法下PC鍵盤按鍵組合爲“ni”,而在一般數字鍵盤下,其按鍵組合則爲“64”。
在多數手持式設備(如智能電話)中,以0~9數字鍵與幾個簡單的控制鍵實現漢字輸入,比較著名的是在手機中廣泛採用的T9 和iTap 輸入法。這裏我們介紹一種簡單的拼音輸入法的實現方法。
一般終端鍵盤包括12個按鍵,分別是0~9數字鍵和“*”、“#”兩個特殊鍵。按通用規則,數字1對應空格,其功能基本等同於PC機中的空格鍵,用於輸入空格或作爲當前漢字的確認鍵;2~9數字鍵分別對應下述漢語拼音字母:
2:a b c 3:d e f 4:g h i
5:j k l 6:m n o 7:p q r s
8:t u v 9:w x y z
而“0”、“*”、“#”鍵則作爲輸入法中的控制鍵。我們將“#”作爲“選擇鍵”,用於選取同一數字鍵組合下的不同拼音組合。
輸入法中使用了兩個重要數據結構,分別是PY_NODE和PY_SUBNODE。每個PY_NODE對應一個數字鍵組合,PY_SUBNODE則對應一組拼音組合。由於一個數字組合可對應多個拼音組合(如“226”對應“ban”、“bao”、“can ”、“cao”),因此這兩個結構實現的是一個兩級的對應表。
PY_NODE按樹組織,而PY_SUBNODE按雙向鏈表組織。二者的基本關係如圖1所示。
以下是兩個結構的定義:
typedef struct py_node{
unsigned int son[8]; //對應下次2~9按鍵輸入時應轉到的PY_NODE的ID號
unsigned int father; //父節點ID號
struct py_subnode *ptrpy; //指向下屬第一個PY_SUBNODE的指針
}PY_NODE;
typedef rom struct py_subnode{
unsigned char py[7]; //本節點的拼音字符串
struct py_subnode *prev; //指向前一PY_SUBNODE的指針
struct py_subnode *next; //指向下一PY_SUBNODE的指針
unsigned char *ptrUnicode; //指向本節點對應Unicode碼錶的指針
}PY_SUBNODE;
設計中我們所參照的漢語拼音表中共有412種組合,這樣系統中必須有412個PY_SUBNODE與其一一對應;系統中共建立了250個PY_NODE。建立此部分數據的工作比較繁瑣,分以下5個步驟進行:
1、 漢字按拼音進行分組,按常用程度排序,並將漢字轉化爲Unicode碼或國標碼,碼型視系統要求而定;
2、 將有效拼音轉換爲數字鍵盤值組合,如拼音“cui”轉爲數字值“284”,這些值對應了部分PY_NODE;
3、 增加中間PY_NODE,用於表示本身無效但後續輸入有效的拼音,如“b”、“c”、“don”、“dua”等節點;
4、 將數字鍵組合相同的PY_SUBNODE編成鏈表,由某一PY_NODE中的ptrpy指針指向表頭;
5、 按數字鍵組合的關係,將PY_NODE組成樹。
圖1中所示組織關係並不複雜,但其工作量不小,一般情況下可編寫轉換程序自動建立。圖2爲拼音輸入法數據結構的一個片斷。
在改變當前PY_NODE時,一般應伴有一些顯示操作,因應用不同各有差異,此處不做過多說明。
在當前節點下,可以用某一指定控制鍵(如“#”鍵)來選擇此PY_NODE下屬的PY_SUBNODE以縮小漢字的選取範圍。
增加功能
上述拼音輸入法比較簡單,且完成了輸入法需要的基本功能。對於某些應用場合,對輸入法還有更多的要求,可在上述方法的基礎上進行改進實現。一些常見的要求和改進方法列舉如下:
① 增加常用字功能
在上述輸入法中,增加常用漢字。只考慮國標碼中的約7000常用漢字情況下,輸入法所佔用的存儲空間增加14kB。
② 增加聯想功能
爲使輸入更爲友好,很多輸入法設有聯想功能,即在輸入一個漢字後,此漢字常用的後續漢字自動成爲候選項由用戶選擇。
③ 筆劃輸入法
筆劃輸入法較之拼音輸入法的優勢在於重碼少,輸入不常用漢字時也不必多次翻頁查找。
以五筆劃輸入法爲例,通過五個按鍵即可輸入漢字。該輸入法將漢字筆劃分爲5種筆劃,即:“一”、“丨”、“丿”、“丶”和“-”五種筆劃,分別對應數字鍵“7”、“8”、“9”、“*”、“0”,如“你”字的組合爲“丿”、“丨”、“丿”、“-”、“丨”、“丿”、“丶”。
筆劃輸入法與拼音輸入法的區別在於人的感覺而非機器的操作,本質上只是按鍵組合與漢字碼表對應關係有所不同,如“你”在拼音輸入法下對應“64”,而在筆劃輸入法下則對應“989089*”。
④ 關於特殊符號、英文和數字
對於一些常用的特殊符號、英文和數字的輸入,較常用的做法是將以單獨的輸入法實現。
軟、硬件設計
輸入法的性能優劣,更多的不是體現在算法,而是是否符合實際需求。因此它的優化工作是對前述PY_NODE和PY_SUBNODE組織的優化,如漢字次序的安排、聯想功能中後序字的組織、以及操作界面的設計是否適合人們的使用習慣。因算法本身很簡單,所以用C語言可實現較高的代碼效率,以及較好的可移植性。
對於很多8位MCU,地址空間不大於64kB。這樣小的空間對於漢字界面中的漢字庫和輸入法中的大量數據結構是遠遠不夠的(如一、二級常用字的16×16點陣漢字庫至少需要約220kB),因此常使用地址分頁方式實現地址擴展。在MCU外部設一鎖存器作爲“頁”寄存器,每頁大小根據MCU特性和實際需求確定,如MCS51系列最大可爲64kB一頁。由於頁寄存器的操作爲獨佔型的,因此在中斷內不能進行操作;而在基於RTOS的多任務環境下,應避免多個任務同時使用頁寄存器。
結語
由於8位、16位MCU的應用場合多是低成本的設備,當商用輸入法的成本無法接受或無法得到時,自行編寫輸入法應是可行的。當然,本文所討論的只是實現輸入法的基本方法,雖然方法可行,但所編寫的輸入法代碼應經過較長時間的測試纔可以作爲產品的正式軟件發佈。
直接在Keil下仿真的T9拼音輸入法(完整版)
作者:佚名 文章來源:侃單片機 點擊數:1481 更新時間:2005-4-14
/*
看到論壇上有人發T9拼音輸入法,好多人感興趣啊!
呵呵,也把我很久以前的程序找出來重新編譯了一下,
特點是直接在Keil下仿真,切換到串口窗口就可以直接看到結果。
希望大家喜歡哦
仿真步驟如下:
1、把3個帖子的內容分別保存爲51t9py.c,51t9py_indexa.h,5py_mb.h,放在同一目錄下,將51t9py.c加入工程編譯
2、由於Keil的模擬串口是單字節顯示,漢字顯示爲亂碼,所以要加掛RICHWIN或RichView這種會重新刷新顯示的中文平臺,或手工刷新屏幕,所以請先到 http://www.pchome.net/dl/chinese.htm 下載RichView,安裝運行
3、在Keil環境下可以直接按“Ctrl+F5”鍵仿真,按“F5”全速運行,切換到在串口依次輸入: //
64*.6 426***.5 98*.7 936.3 586.1 4826*.1 9464*.7 64*.6試試:-)
4、按鍵對應(根據我自己的手機設置的,全部在PC的小鍵盤操作): //
Num /:上一拼音?*:下一拼音 //
7:pqrs 8:tuv 9:wxyz -:前翻頁 //
4:ghi 5:jkl 6:mno +:後翻頁 //
1:? 2:abc 3:def 回車鍵:輸入狀態和選字狀態切換 //
0:? .和空格及回車鍵:輸入狀態和選字狀態切換 //
*/
//請把這個帖子的內容保存爲51t9py.c
//--------------------------------------------------------------------------//
// 源程序大公開 //
// (c) Copyright 2001-2003 xuwenjun //
// All Rights Reserved //
// V1.00 //
//--------------------------------------------------------------------------//
//標 題: T9拼音輸入法模塊 //
//文件名: 51t9py.c //
//版 本: V1.00 //
//修改人: 徐文軍 E-mail:[email protected] //
//日 期: 05-4-8 //
//描 述: T9拼音輸入法模塊 //
//聲 明: //
// 以下代碼僅免費提供給學習用途,但引用或修改後必須在文件中聲明出處. //
// 如用於商業用途請與作者聯繫. E-mail:[email protected] //
// 有問題請mailto [email protected] 歡迎與我交流! //
//--------------------------------------------------------------------------//
//老版本: 無 老版本文件名: //
//創建人: 徐文軍 E-mail:[email protected] //
//日 期: 02-11-05 //
//描 述: //
// 1、很久以前的程序,根據網友張 凱、李 強的51py輸入法子程序改編, //
// 增加索引、完善主程序、測試程序,使之在Keil下直接仿真 //
// 2、在Keil環境下可以直接按“Ctrl+F5”鍵仿真,切換到在串口依次輸入: //
// 64*.6 426***.5 98*.7 936.3 586.1 4826*.1 9464*.7 64*.6試試:-) //
// 3、由於Keil的模擬串口是單字節顯示,漢字顯示爲亂碼,所以要加掛 //
// RICHWIN或RichView這種會重新刷新顯示的中文平臺,或手工刷新屏幕 //
// (RichView可以到 http://www.pchome.net/dl/chinese.htm 下載) //
// 4、按鍵對應(根據我自己的手機設置的,全部在PC的小鍵盤操作): //
// Num /:上一拼音?*:下一拼音 //
// 7:pqrs 8:tuv 9:wxyz -:前翻頁 //
// 4:ghi 5:jkl 6:mno +:後翻頁 //
// 1:? 2:abc 3:def 回車鍵:輸入狀態和選字狀態切換 //
// 0:? .和空格及回車鍵:輸入狀態和選字狀態切換 //
//--------------------------------------------------------------------------//
#include<string.h>
#include<stdio.h>
#include"PY_mb.h"
//#include"51t9_MB.h"
#include"51t9py_indexa.h"
#define CNTLQ 0x11
#define CNTLS 0x13
#define DEL 0x7F
#define BACKSPACE 0x08
#define CR 0x0D
#define LF 0x0A
unsigned char cpt9PY_Mblen;
struct t9PY_index code * cpt9PY_Mb[16];
unsigned char t9PY_ime(char *strInput_t9PY_str)
{
struct t9PY_index *cpHZ,*cpHZedge,*cpHZTemp;
unsigned char i,j,cInputStrLength;
cpt9PY_Mblen=0; //完全匹配組數
j=0; //j爲匹配最大值
cInputStrLength=strlen(strInput_t9PY_str); //輸入拼音串長度//
if(*strInput_t9PY_str=='/0')return(0); //如果輸入空字符返回0//
cpHZ=&(t9PY_index2[0]); //查首字母索引//
cpHZedge=t9PY_index2+sizeof(t9PY_index2)/sizeof(t9PY_index2[0]);
// strInput_t9PY_str++; //指向拼音串第二個字母//
while(cpHZ < cpHZedge) //待查詢記錄條數
{
for(i=0;i<cInputStrLength;i++)
{
if(*(strInput_t9PY_str+i)!=*((*cpHZ).t9PY_T9+i)) //檢查字符串匹配
{
if (i+1 > j)
{
j=i+1; //j爲匹配最大值
cpHZTemp=cpHZ;
}
break; //發現字母串不配,退出//
}
}
if((i==cInputStrLength) && (cpt9PY_Mblen<16)) //字母串全配,最多8組
{
cpt9PY_Mb[cpt9PY_Mblen]=cpHZ;
cpt9PY_Mblen++;
}
cpHZ++;
}
if(j!=cInputStrLength) //不完全匹配輸出最多匹配的1組
cpt9PY_Mb[0]=cpHZTemp;
return (cpt9PY_Mblen); //輸出完全匹配組數,0爲無果而終//
}
char * t9PY_ime_mb(char *strInput_t9PY_str)
{
if(t9PY_ime(strInput_t9PY_str) > 0)
return ((*(cpt9PY_Mb[0])).PY_mb);
else
return (PY_mb_space);
}
void t9PY_Test(void)
{
bit PYEnter=0;
bit HZok=0;
unsigned char temp;
// unsigned char temp2;
unsigned char t9PYn=0;
char idata inline[16]={0x00};
idata char chinese_word[3]=" ";
char tempchar,Add=0,i=0;
struct t9PY_index *cpTemp;
// cpTemp=t9PY_index2;
// printf ("/n按鍵 /:上一拼音 *:下一拼音 .和空格及回車鍵:輸入狀態和選字狀態切換/n"); //
printf ("請按鍵:2-abc 3-def 4-ghi 5-jkl 6-mno 7-pqrs 8-tuv 9-wxyz /n"); //
while(!HZok)
{
tempchar=getchar();
switch (tempchar)
{
// case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
if (~PYEnter)
{
inline[i]=tempchar;
i++;
Add=0;
t9PY_ime(inline);
}
break;
case '/':
if (t9PYn >0) t9PYn --;
break;
case '*':
t9PYn ++;
if (t9PYn >=cpt9PY_Mblen) t9PYn --;
break;
case '-':
if (Add >= 12) Add -= 12;
break;
case '=':
case '+':
if (Add < strlen((*cpTemp).PY_mb) -12 )Add += 12;
break;
case BACKSPACE:
if (i>0) i--;
inline[i]=0x00;
Add=0;
t9PY_ime(inline);
// cpTemp=cpt9PY_Mb[t9PYn];
break;
// case '/n':
case '.': //輸入狀態和選字狀態切換
case ' ':
case '/n':
PYEnter ^=1;
break;
default :
// HZok=1;
break;
}
printf (" /r");
if (PYEnter)
{
printf ("選");
cpTemp=cpt9PY_Mb[t9PYn];
if((cpTemp != PY_mb_space) && (tempchar>='1') && (tempchar<='9'))
{
HZok=1;
t9PYn=0;
printf (" /r");
// printf ("%s/n",inline);
chinese_word[0]=*((*cpTemp).PY_mb+Add+(tempchar-'1')*2);
chinese_word[1]=*((*cpTemp).PY_mb+Add+(tempchar-'1')*2+1);
printf (chinese_word);
printf ("/n");
}
else
{
// printf ((*(cpTemp)).PY);
printf (":");
printf ((*cpTemp).PY_mb+Add);
// printf ("/n拼音1 2 3 4 5 6 7 8 9/r");
}
}
else
{
printf ("拼");
for (temp=t9PYn;temp<cpt9PY_Mblen;temp++)
{
cpTemp=cpt9PY_Mb[temp];
// temp2=((strlen((*(cpTemp)).PY_mb)-Add)/2);
// printf ("%2bd:%02bd:",temp,temp2);
printf (":");
printf ((*(cpTemp)).PY);
// printf ((*(cpTemp)).PY_mb+Add);
// printf ("/n");
}
// printf ("/n");
}
}
}
//-----以下爲測試程序---------------------------------------------------------------------//
#include <REG52.H>
#include <stdio.h>
#ifdef MONITOR51 /* Debugging with Monitor-51 needs */
char code reserve [3] _at_ 0x23; /* space for serial interrupt if */
#endif /* Stop Exection with Serial Intr. */
/* is enabled */
void main (void) {
char input_string[]="98";
/*------------------------------------------------
Setup the serial port for 1200 baud at 16MHz.
------------------------------------------------*/
#ifndef MONITOR51
SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */
TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */
TH1 = 250; /* TH1: reload value for 9600 baud @ 11.0592MHz */
TR1 = 1; /* TR1: timer 1 run */
TI = 1; /* TI: set TI to send first char of UART */
#endif
/*------------------------------------------------
Note that an embedded program never exits (because
there is no operating system to return to). It
must loop and execute forever.
------------------------------------------------*/
// printf ("Hello World/n"); /* Print "Hello World" */
printf ("/n");
printf ("%s/n",input_string);
printf (t9PY_ime_mb(input_string));
printf ("按鍵對應:(全部在PC的小鍵盤操作)/n");
printf (" /-上一拼音 *-下一拼音/n");
printf ("7-pqrs 8-tuv 9-wxyz --前翻頁/n");
printf ("4-ghi 5-jkl 6-mno +-後翻頁/n");
printf ("1-無效 2-abc 3-def 回車鍵-輸入狀態和選字狀態切換/n");
printf ("0-無效 .和空格及回車鍵-輸入狀態和選字狀態切換/n/n");
while(1)
{
t9PY_Test();
}
}
//請把這個帖子的內容保存爲51t9py_indexa.h
//--------------------------------------------------------------------------//
// 源程序大公開 //
// (c) Copyright 2001-2003 xuwenjun //
// All Rights Reserved //
// V1.00 //
//--------------------------------------------------------------------------//
//標 題: T9拼音輸入法索引 //
//文件名: 51t9py_indexa.h //
//版 本: V1.00 //
//修改人: 徐文軍 E-mail:[email protected] //
//日 期: 05-4-8 //
//描 述: T9拼音輸入法索引 //
//聲 明: //
// 以下代碼僅免費提供給學習用途,但引用或修改後必須在文件中聲明出處. //
// 如用於商業用途請與作者聯繫. E-mail: [email protected] //
// 有問題請mailto [email protected] 歡迎與我交流! //
//--------------------------------------------------------------------------//
//老版本: 無 老版本文件名: //
//創建人: 徐文軍 E-mail:[email protected] //
//日 期: 02-11-05 //
//描 述: //
//--------------------------------------------------------------------------//
struct t9PY_index
{
char code *t9PY_T9;
char code *PY;
char code *PY_mb;
};
/*"拼音輸入法查詢碼錶,T9數字字母索引表(index)"*/
struct t9PY_index code t9PY_index2[] ={{"","",PY_mb_space},
{"2","a",PY_mb_a},
{"3","e",PY_mb_e},
{"4","i",PY_mb_space},
{"6","o",PY_mb_o},
{"8","u",PY_mb_space},
{"8","v",PY_mb_space},
{"24","ai",PY_mb_ai},
{"26","an",PY_mb_an},
{"26","ao",PY_mb_ao},
{"22","ba",PY_mb_ba},
{"24","bi",PY_mb_bi},
{"26","bo",PY_mb_bo},
{"28","bu",PY_mb_bu},
{"22","ca",PY_mb_ca},
{"23","ce",PY_mb_ce},
{"24","ci",PY_mb_ci},
{"28","cu",PY_mb_cu},
{"32","da",PY_mb_da},
{"33","de",PY_mb_de},
{"34","di",PY_mb_di},
{"38","du",PY_mb_du},
{"36","en",PY_mb_en},
{"37","er",PY_mb_er},
{"32","fa",PY_mb_fa},
{"36","fo",PY_mb_fo},
{"38","fu",PY_mb_fu},
{"42","ha",PY_mb_ha},
{"42","ga",PY_mb_ga},
{"43","ge",PY_mb_ge},
{"43","he",PY_mb_he},
{"48","gu",PY_mb_gu},
{"48","hu",PY_mb_hu},
{"54","ji",PY_mb_ji},
{"58","ju",PY_mb_ju},
{"52","ka",PY_mb_ka},
{"53","ke",PY_mb_ke},
{"58","ku",PY_mb_ku},
{"52","la",PY_mb_la},
{"53","le",PY_mb_le},
{"54","li",PY_mb_li},
{"58","lu",PY_mb_lu},
{"58","lv",PY_mb_lv},
{"62","ma",PY_mb_ma},
{"63","me",PY_mb_me},
{"64","mi",PY_mb_mi},
{"66","mo",PY_mb_mo},
{"68","mu",PY_mb_mu},
{"62","na",PY_mb_na},
{"63","ne",PY_mb_ne},
{"64","ni",PY_mb_ni},
{"68","nu",PY_mb_nu},
{"68","nv",PY_mb_nv},
{"68","ou",PY_mb_ou},
{"72","pa",PY_mb_pa},
{"74","pi",PY_mb_pi},
{"76","po",PY_mb_po},
{"78","pu",PY_mb_pu},
{"74","qi",PY_mb_qi},
{"78","qu",PY_mb_qu},
{"73","re",PY_mb_re},
{"74","ri",PY_mb_ri},
{"78","ru",PY_mb_ru},
{"72","sa",PY_mb_sa},
{"73","se",PY_mb_se},
{"74","si",PY_mb_si},
{"78","su",PY_mb_su},
{"82","ta",PY_mb_ta},
{"83","te",PY_mb_te},
{"84","ti",PY_mb_ti},
{"88","tu",PY_mb_tu},
{"92","wa",PY_mb_wa},
{"96","wo",PY_mb_wo},
{"98","wu",PY_mb_wu},
{"94","xi",PY_mb_xi},
{"98","xu",PY_mb_xu},
{"92","ya",PY_mb_ya},
{"93","ye",PY_mb_ye},
{"94","yi",PY_mb_yi},
{"96","yo",PY_mb_yo},
{"98","yu",PY_mb_yu},
{"92","za",PY_mb_za},
{"93","ze",PY_mb_ze},
{"94","zi",PY_mb_zi},
{"98","zu",PY_mb_zu},
{"264","ang",PY_mb_ang},
{"224","bai",PY_mb_bai},
{"226","ban",PY_mb_ban},
{"226","bao",PY_mb_bao},
{"234","bei",PY_mb_bei},
{"236","ben",PY_mb_ben},
{"243","bie",PY_mb_bie},
{"246","bin",PY_mb_bin},
{"224","cai",PY_mb_cai},
{"226","can",PY_mb_can},
{"226","cao",PY_mb_cao},
{"242","cha",PY_mb_cha},
{"243","che",PY_mb_che},
{"244","chi",PY_mb_chi},
{"248","chu",PY_mb_chu},
{"268","cou",PY_mb_cou},
{"284","cui",PY_mb_cui},
{"286","cun",PY_mb_cun},
{"286","cuo",PY_mb_cuo},
{"324","dai",PY_mb_dai},
{"326","dan",PY_mb_dan},
{"326","dao",PY_mb_dao},
{"343","die",PY_mb_die},
{"348","diu",PY_mb_diu},
{"368","dou",PY_mb_dou},
{"384","dui",PY_mb_dui},
{"386","dun",PY_mb_dun},
{"386","duo",PY_mb_duo},
{"326","fan",PY_mb_fan},
{"334","fei",PY_mb_fei},
{"336","fen",PY_mb_fen},
{"368","fou",PY_mb_fou},
{"424","gai",PY_mb_gai},
{"426","gan",PY_mb_gan},
{"426","gao",PY_mb_gao},
{"434","gei",PY_mb_gei},
{"436","gen",PY_mb_gan},
{"468","gou",PY_mb_gou},
{"482","gua",PY_mb_gua},
{"484","gui",PY_mb_gui},
{"486","gun",PY_mb_gun},
{"486","guo",PY_mb_guo},
{"423","hai",PY_mb_hai},
{"426","han",PY_mb_han},
{"426","hao",PY_mb_hao},
{"434","hei",PY_mb_hei},
{"436","hen",PY_mb_hen},
{"468","hou",PY_mb_hou},
{"482","hua",PY_mb_hua},
{"484","hui",PY_mb_hui},
{"486","hun",PY_mb_hun},
{"486","huo",PY_mb_huo},
{"542","jia",PY_mb_jia},
{"543","jie",PY_mb_jie},
{"546","jin",PY_mb_jin},
{"548","jiu",PY_mb_jiu},
{"583","jue",PY_mb_jue},
{"586","jun",PY_mb_jun},
{"524","kai",PY_mb_kai},
{"526","kan",PY_mb_kan},
{"526","kao",PY_mb_kao},
{"536","ken",PY_mb_ken},
{"568","kou",PY_mb_kou},
{"582","kua",PY_mb_kua},
{"584","kui",PY_mb_kui},
{"586","kun",PY_mb_kun},
{"586","kuo",PY_mb_kuo},
{"524","lai",PY_mb_lai},
{"526","lan",PY_mb_lan},
{"526","lao",PY_mb_lao},
{"534","lei",PY_mb_lei},
{"543","lie",PY_mb_lie},
{"546","lin",PY_mb_lin},
{"548","liu",PY_mb_liu},
{"568","lou",PY_mb_lou},
{"583","lue",PY_mb_lue},
{"586","lun",PY_mb_lun},
{"586","luo",PY_mb_luo},
{"624","mai",PY_mb_mai},
{"626","man",PY_mb_man},
{"626","mao",PY_mb_mao},
{"634","mei",PY_mb_mei},
{"636","men",PY_mb_men},
{"643","mie",PY_mb_mie},
{"646","min",PY_mb_min},
{"648","miu",PY_mb_miu},
{"668","mou",PY_mb_mou},
{"624","nai",PY_mb_nai},
{"626","nan",PY_mb_nan},
{"626","nao",PY_mb_nao},
{"634","nei",PY_mb_nei},
{"636","nen",PY_mb_nen},
{"643","nie",PY_mb_nie},
{"646","nin",PY_mb_nin},
{"648","niu",PY_mb_niu},
{"683","nue",PY_mb_nue},
{"686","nuo",PY_mb_nuo},
{"724","pai",PY_mb_pai},
{"726","pan",PY_mb_pan},
{"726","pao",PY_mb_pao},
{"734","pei",PY_mb_pei},
{"736","pen",PY_mb_pen},
{"743","pie",PY_mb_pie},
{"746","pin",PY_mb_pin},
{"768","pou",PY_mb_pou},
{"742","qia",PY_mb_qia},
{"743","qie",PY_mb_qie},
{"746","qin",PY_mb_qin},
{"748","qiu",PY_mb_qiu},
{"783","que",PY_mb_que},
{"786","qun",PY_mb_qun},
{"726","ran",PY_mb_ran},
{"726","rao",PY_mb_rao},
{"736","ren",PY_mb_ren},
{"768","rou",PY_mb_rou},
{"784","rui",PY_mb_rui},
{"786","run",PY_mb_run},
{"786","ruo",PY_mb_ruo},
{"724","sai",PY_mb_sai},
{"726","sao",PY_mb_sao},
{"726","san",PY_mb_san},
{"736","sen",PY_mb_sen},
{"742","sha",PY_mb_sha},
{"743","she",PY_mb_she},
{"744","shi",PY_mb_shi},
{"748","shu",PY_mb_shu},
{"768","sou",PY_mb_sou},
{"784","sui",PY_mb_sui},
{"786","sun",PY_mb_sun},
{"786","suo",PY_mb_suo},
{"824","tai",PY_mb_tai},
{"826","tan",PY_mb_tan},
{"826","tao",PY_mb_tao},
{"843","tie",PY_mb_tie},
{"868","tou",PY_mb_tou},
{"884","tui",PY_mb_tui},
{"886","tun",PY_mb_tun},
{"886","tuo",PY_mb_tuo},
{"924","wai",PY_mb_wai},
{"926","wan",PY_mb_wan},
{"934","wei",PY_mb_wei},
{"936","wen",PY_mb_wen},
{"942","xia",PY_mb_xia},
{"943","xie",PY_mb_xie},
{"946","xin",PY_mb_xin},
{"948","xiu",PY_mb_xiu},
{"983","xue",PY_mb_xue},
{"986","xun",PY_mb_xun},
{"926","yan",PY_mb_yan},
{"926","yao",PY_mb_yao},
{"946","yin",PY_mb_yin},
{"968","you",PY_mb_you},
{"983","yue",PY_mb_yue},
{"986","yun",PY_mb_yun},
{"924","zai",PY_mb_zai},
{"926","zan",PY_mb_zan},
{"926","zao",PY_mb_zao},
{"934","zei",PY_mb_zei},
{"936","zen",PY_mb_zen},
{"942","zha",PY_mb_zha},
{"943","zhe",PY_mb_zhe},
{"944","zhi",PY_mb_zhi},
{"948","zhu",PY_mb_zhu},
{"968","zou",PY_mb_zou},
{"984","zui",PY_mb_zui},
{"986","zun",PY_mb_zun},
{"986","zuo",PY_mb_zuo},
{"2264","bang",PY_mb_bang},
{"2364","beng",PY_mb_beng},
{"2426","bian",PY_mb_bian},
{"2426","biao",PY_mb_biao},
{"2464","bing",PY_mb_bing},
{"2264","cang",PY_mb_cang},
{"2364","ceng",PY_mb_ceng},
{"2424","chai",PY_mb_chai},
{"2426","chan",PY_mb_chan},
{"2426","chao",PY_mb_chao},
{"2436","chen",PY_mb_chen},
{"2468","chou",PY_mb_chou},
{"2484","chuai",PY_mb_chuai},
{"2484","chui",PY_mb_chui},
{"2484","chun",PY_mb_chun},
{"2486","chuo",PY_mb_chuo},
{"2664","cong",PY_mb_cong},
{"2826","cuan",PY_mb_cuan},
{"3264","dang",PY_mb_dang},
{"3364","deng",PY_mb_deng},
{"3426","dian",PY_mb_dian},
{"3426","diao",PY_mb_diao},
{"3464","ding",PY_mb_ding},
{"3664","dong",PY_mb_dong},
{"3826","duan",PY_mb_duan},
{"3264","fang",PY_mb_fang},
{"3364","feng",PY_mb_feng},
{"4264","gang",PY_mb_gang},
{"4364","geng",PY_mb_geng},
{"4664","gong",PY_mb_gong},
{"4824","guai",PY_mb_guai},
{"4826","guan",PY_mb_guan},
{"4264","hang",PY_mb_hang},
{"4364","heng",PY_mb_heng},
{"4664","hong",PY_mb_hong},
{"4823","huai",PY_mb_huai},
{"4826","huan",PY_mb_huan},
{"5426","jian",PY_mb_jian},
{"5426","jiao",PY_mb_jiao},
{"5464","jing",PY_mb_jing},
{"5826","juan",PY_mb_juan},
{"5264","kang",PY_mb_kang},
{"5364","keng",PY_mb_keng},
{"5664","kong",PY_mb_kong},
{"5824","kuai",PY_mb_kuai},
{"5826","kuan",PY_mb_kuan},
{"5264","lang",PY_mb_lang},
{"5366","leng",PY_mb_leng},
{"5426","lian",PY_mb_lian},
{"5426","liao",PY_mb_liao},
{"5464","ling",PY_mb_ling},
{"5664","long",PY_mb_long},
{"5826","luan",PY_mb_luan},
{"6264","mang",PY_mb_mang},
{"6364","meng",PY_mb_meng},
{"6426","mian",PY_mb_mian},
{"6426","miao",PY_mb_miao},
{"6464","ming",PY_mb_ming},
{"6264","nang",PY_mb_nang},
{"6364","neng",PY_mb_neng},
{"6426","nian",PY_mb_nian},
{"6426","niao",PY_mb_niao},
{"6464","ning",PY_mb_ning},
{"6664","nong",PY_mb_nong},
{"6826","nuan",PY_mb_nuan},
{"7264","pang",PY_mb_pang},
{"7364","peng",PY_mb_peng},
{"7426","pian",PY_mb_pian},
{"7426","piao",PY_mb_piao},
{"7464","ping",PY_mb_ping},
{"7426","qian",PY_mb_qian},
{"7426","qiao",PY_mb_qiao},
{"7464","qing",PY_mb_qing},
{"7826","quan",PY_mb_quan},
{"7264","rang",PY_mb_rang},
{"7364","reng",PY_mb_reng},
{"7664","rong",PY_mb_rong},
{"7826","ruan",PY_mb_ruan},
{"7264","sang",PY_mb_sang},
{"7364","seng",PY_mb_seng},
{"7424","shai",PY_mb_shai},
{"7426","shan",PY_mb_shan},
{"7426","shao",PY_mb_shao},
{"7436","shen",PY_mb_shen},
{"7468","shou",PY_mb_shou},
{"7482","shua",PY_mb_shua},
{"7484","shui",PY_mb_shui},
{"7486","shun",PY_mb_shun},
{"7486","shuo",PY_mb_shuo},
{"7664","song",PY_mb_song},
{"7826","suan",PY_mb_suan},
{"8264","tang",PY_mb_tang},
{"8364","teng",PY_mb_teng},
{"8426","tian",PY_mb_tian},
{"8426","tiao",PY_mb_tiao},
{"8464","ting",PY_mb_ting},
{"8664","tong",PY_mb_tong},
{"8826","tuan",PY_mb_tuan},
{"9264","wang",PY_mb_wang},
{"9364","weng",PY_mb_weng},
{"9426","xian",PY_mb_xiao},
{"9426","xiao",PY_mb_xiao},
{"9464","xing",PY_mb_xing},
{"9826","xuan",PY_mb_xuan},
{"9264","yang",PY_mb_yang},
{"9464","ying",PY_mb_ying},
{"9664","yong",PY_mb_yong},
{"9826","yuan",PY_mb_yuan},
{"9264","zang",PY_mb_zang},
{"9364","zeng",PY_mb_zeng},
{"9424","zhai",PY_mb_zhai},
{"9426","zhan",PY_mb_zhan},
{"9426","zhao",PY_mb_zhao},
{"9436","zhen",PY_mb_zhen},
{"9468","zhou",PY_mb_zhou},
{"9482","zhua",PY_mb_zhua},
{"9484","zhui",PY_mb_zhui},
{"9486","zhun",PY_mb_zhun},
{"9486","zhuo",PY_mb_zhuo},
{"9664","zong",PY_mb_zong},
{"9826","zuan",PY_mb_zuan},
{"24264","chang",PY_mb_chang},
{"24364","cheng",PY_mb_cheng},
{"24664","chong",PY_mb_chong},
{"24826","chuan",PY_mb_chuan},
{"48264","guang",PY_mb_guang},
{"48264","huang",PY_mb_huang},
{"54264","jiang",PY_mb_jiang},
{"54664","jiong",PY_mb_jiong},
{"58264","kuang",PY_mb_kuang},
{"54264","liang",PY_mb_liang},
{"64264","niang",PY_mb_niang},
{"74264","qiang",PY_mb_qiang},
{"74664","qiong",PY_mb_qiong},
{"74264","shang ",PY_mb_shang},
{"74364","sheng",PY_mb_sheng},
{"74824","shuai",PY_mb_shuai},
{"74826","shuan",PY_mb_shuan},
{"94264","xiang",PY_mb_xiang},
{"94664","xiong",PY_mb_xiong},
{"94264","zhang",PY_mb_zhang},
{"94364","zheng",PY_mb_zheng},
{"94664","zhong",PY_mb_zhong},
{"94824","zhuai",PY_mb_zhuai},
{"94826","zhuan",PY_mb_zhuan},
{"248264","chuang",PY_mb_chuang},
{"748264","shuang",PY_mb_shuang},
{"948264","zhuang",PY_mb_zhuang},
};
//py_mb.h
//"拼音輸入法漢字排列表,碼錶(mb)"
code char PY_mb_a[] ={"阿啊"};
code char PY_mb_ai[] ={"哎哀唉埃挨皚癌矮藹艾愛隘礙"};
code char PY_mb_an[] ={"安氨鞍俺岸按案胺暗"};
code char PY_mb_ang[] ={"骯昂盎"};
code char PY_mb_ao[] ={"凹敖熬翱襖傲奧澳懊"};
code char PY_mb_ba[] ={"八巴叭扒吧芭疤捌笆拔跋把靶壩爸罷霸"};
code char PY_mb_bai[] ={"白百佰柏擺敗拜稗"};
code char PY_mb_ban[] ={"扳班般頒斑搬板版辦半伴扮拌絆瓣"};
code char PY_mb_bang[] ={"邦幫梆綁榜膀蚌傍棒謗磅鎊"};
code char PY_mb_bao[] ={"包苞胞褒雹寶飽保堡報抱豹鮑暴爆剝薄瀑"};
code char PY_mb_bei[] ={"卑杯悲碑北貝狽備背鋇倍被憊焙輩"};
code char PY_mb_ben[] ={"奔本苯笨夯"};
code char PY_mb_beng[] ={"崩繃甭泵迸蹦"};
code char PY_mb_bi[] ={"逼鼻比彼筆鄙幣必畢閉庇毖陛斃敝痹蓖弊碧蔽壁避臂"};
code char PY_mb_bian[] ={"邊編鞭貶扁卞便變遍辨辯辮"};
code char PY_mb_biao[] ={"彪標膘表"};
code char PY_mb_bie[] ={"憋鱉別癟"};
code char PY_mb_bin[] ={"賓彬斌濱瀕擯"};
code char PY_mb_bing[] ={"冰兵丙秉柄炳餅並病"};
code char PY_mb_bo[] ={"撥波玻鉢脖菠播伯駁帛泊勃鉑舶博渤搏箔膊卜"};
code char PY_mb_bu[] ={"補哺捕不布步怖部埠簿"};
code char PY_mb_ca[] ={"擦"};
code char PY_mb_cai[] ={"猜才材財裁採彩睬踩菜蔡"};
code char PY_mb_can[] ={"參餐殘蠶慚慘燦"};
code char PY_mb_cang[] ={"倉滄蒼艙藏"};
code char PY_mb_cao[] ={"操糙曹槽草"};
code char PY_mb_ce[] ={"冊側廁測策"};
code char PY_mb_ceng[] ={"層蹭曾"};
code char PY_mb_cha[] ={"叉插查茬茶搽察碴岔詫差剎"};
code char PY_mb_chai[] ={"拆柴豺"};
code char PY_mb_chan[] ={"摻攙讒饞纏蟬產鏟闡顫"};
code char PY_mb_chang[] ={"昌猖腸嘗償常廠場敞暢倡唱"};
code char PY_mb_chao[] ={"抄鈔超巢朝嘲潮吵炒綽"};
code char PY_mb_che[] ={"車扯徹掣撤澈"};
code char PY_mb_chen[] ={"郴塵臣忱沉辰陳晨襯趁"};
code char PY_mb_cheng[] ={"稱撐成呈承誠城乘懲程澄橙逞騁秤"};
code char PY_mb_chi[] ={"喫癡弛池馳遲持尺侈齒恥斥赤熾翅"};
code char PY_mb_chong[] ={"充衝蟲崇寵"};
code char PY_mb_chou[] ={"抽仇綢疇愁稠籌酬躊醜瞅臭"};
code char PY_mb_chu[] ={"出初除廚滁鋤雛櫥躇礎儲楚處搐觸矗畜"};
code char PY_mb_chuai[] ={"揣"};
code char PY_mb_chuan[] ={"川穿傳船椽喘串"};
code char PY_mb_chuang[]={"闖瘡窗牀創"};
code char PY_mb_chui[] ={"吹炊垂捶錘"};
code char PY_mb_chun[] ={"春椿純脣淳醇蠢"};
code char PY_mb_chuo[] ={"戳"};
code char PY_mb_ci[] ={"疵詞茨瓷慈辭磁雌此次刺賜"};
code char PY_mb_cong[] ={"囪從匆蔥聰叢"};
code char PY_mb_cou[] ={"湊"};
code char PY_mb_cu[] ={"粗促醋簇"};
code char PY_mb_cuan[] ={"躥竄篡"};
code char PY_mb_cui[] ={"崔催摧脆淬瘁粹翠"};
code char PY_mb_cun[] ={"村存寸"};
code char PY_mb_cuo[] ={"搓磋撮挫措錯"};
code char PY_mb_da[] ={"搭達答瘩打大"};
code char PY_mb_dai[] ={"呆歹傣代帶待怠殆貸袋逮戴"};
code char PY_mb_dan[] ={"丹單擔耽鄲膽撣旦但誕彈憚淡蛋氮"};
code char PY_mb_dang[] ={"當擋黨蕩檔"};
code char PY_mb_dao[] ={"刀導島倒搗禱蹈到悼盜道稻"};
code char PY_mb_de[] ={"得德的"};
code char PY_mb_deng[] ={"燈登蹬等鄧凳瞪"};
code char PY_mb_di[] ={"低堤滴狄迪敵滌笛嫡底抵地弟帝遞第締蒂"};
code char PY_mb_dian[] ={"掂滇顛典點碘電佃甸店墊惦澱奠殿靛"};
code char PY_mb_diao[] ={"刁叼凋碉雕吊釣掉"};
code char PY_mb_die[] ={"爹跌迭諜疊碟蝶"};
code char PY_mb_ding[] ={"丁叮盯釘頂鼎訂定錠"};
code char PY_mb_diu[] ={"丟"};
code char PY_mb_dong[] ={"東冬董懂動凍侗恫棟洞"};
code char PY_mb_dou[] ={"都兜鬥抖陡豆逗痘"};
code char PY_mb_du[] ={"督毒讀犢獨堵賭睹妒杜肚度渡鍍"};
code char PY_mb_duan[] ={"端短段斷緞鍛"};
code char PY_mb_dui[] ={"堆隊對兌"};
code char PY_mb_dun[] ={"噸敦墩蹲盾鈍頓遁"};
code char PY_mb_duo[] ={"多哆奪掇朵垛躲剁墮舵惰跺"};
code char PY_mb_e[] ={"訛俄娥峨鵝蛾額厄扼惡餓鄂遏"};
code char PY_mb_en[] ={"恩"};
code char PY_mb_er[] ={"兒而爾耳洱餌二貳"};
code char PY_mb_fa[] ={"發乏伐罰閥筏法琺"};
code char PY_mb_fan[] ={"帆番翻藩凡礬釩煩樊繁反返犯泛飯範販"};
code char PY_mb_fang[] ={"方坊芳防妨房肪仿訪紡放"};
code char PY_mb_fei[] ={"飛非啡菲肥匪誹吠廢沸肺費"};
code char PY_mb_fen[] ={"分吩紛芬氛酚墳汾焚粉份奮忿憤糞"};
code char PY_mb_feng[] ={"豐風楓封瘋峯烽鋒蜂馮逢縫諷鳳奉"};
code char PY_mb_fo[] ={"佛"};
code char PY_mb_fou[] ={"否"};
code char PY_mb_fu[] ={"夫膚孵敷弗伏扶拂服俘氟浮涪符袱幅福輻撫甫府斧俯釜輔腑腐父訃付婦負附咐阜復赴副傅富賦縛腹覆"};
code char PY_mb_ga[] ={"嘎噶"};
code char PY_mb_gai[] ={"該改鈣蓋溉概"};
code char PY_mb_gan[] ={"幹甘杆肝柑竿稈趕敢感贛"};
code char PY_mb_gang[] ={"岡剛崗綱肛缸鋼港槓"};
code char PY_mb_gao[] ={"皋羔高膏篙糕搞稿鎬告"};
code char PY_mb_ge[] ={"戈疙哥胳鴿割擱歌閣革格葛隔個各鉻咯"};
code char PY_mb_gei[] ={"給"};
code char PY_mb_gen[] ={"根跟"};
code char PY_mb_geng[] ={"更庚耕羹埂耿梗"};
code char PY_mb_gong[] ={"工弓公功攻供宮恭躬龔鞏汞拱共貢"};
code char PY_mb_gou[] ={"勾溝鉤狗苟構購垢夠"};
code char PY_mb_gu[] ={"估咕姑孤沽菇辜箍古谷股骨蠱鼓固故顧僱"};
code char PY_mb_gua[] ={"瓜刮剮寡掛褂"};
code char PY_mb_guai[] ={"乖拐怪"};
code char PY_mb_guan[] ={"關觀官冠棺館管貫慣灌罐"};
code char PY_mb_guang[] ={"光廣逛"};
code char PY_mb_gui[] ={"歸圭龜規閨硅瑰軌詭癸鬼劊櫃貴桂跪"};
code char PY_mb_gun[] ={"輥滾棍"};
code char PY_mb_guo[] ={"郭鍋國果裹過"};
code char PY_mb_ha[] ={"蛤哈"};
code char PY_mb_hai[] ={"孩骸海亥駭害氦"};
code char PY_mb_han[] ={"酣憨含邯函涵寒韓罕喊漢汗旱悍捍焊憾撼翰"};
code char PY_mb_hang[] ={"杭航行"};
code char PY_mb_hao[] ={"毫豪嚎壕好郝號浩耗"};
code char PY_mb_he[] ={"呵喝禾合何和河閡核荷涸盒菏賀褐赫鶴"};
code char PY_mb_hei[] ={"黑嘿"};
code char PY_mb_hen[] ={"痕很狠恨"};
code char PY_mb_heng[] ={"亨哼恆橫衡"};
code char PY_mb_hong[] ={"轟哄烘弘紅宏洪虹鴻"};
code char PY_mb_hou[] ={"侯喉猴吼後厚候"};
code char PY_mb_hu[] ={"乎呼忽弧狐胡壺湖葫瑚糊蝴虎唬互戶護滬"};
code char PY_mb_hua[] ={"花華譁滑猾化劃畫話"};
code char PY_mb_huai[] ={"懷徊淮槐壞"};
code char PY_mb_huan[] ={"歡還環桓緩幻宦喚換渙患煥瘓豢"};
code char PY_mb_huang[] ={"荒慌皇凰黃惶煌蝗磺簧恍晃謊幌"};
code char PY_mb_hui[] ={"灰恢揮輝徽回蛔悔卉匯會諱繪誨燴賄晦穢惠毀慧"};
code char PY_mb_hun[] ={"昏葷婚渾魂混"};
code char PY_mb_huo[] ={"豁活火夥或貨獲禍惑霍"};
code char PY_mb_ji[] ={"譏擊飢圾機肌雞跡姬積基績緝畸箕稽激及吉汲級即極急疾棘集嫉輯籍幾己擠脊計記伎紀妓忌技際劑季既濟繼寂寄悸祭薊冀藉"};
code char PY_mb_jia[] ={"加夾佳枷家嘉莢頰甲賈鉀價駕架假嫁稼挾"};
code char PY_mb_jian[] ={"奸尖堅殲間肩艱兼監箋緘煎揀儉柬繭撿減剪檢礆簡鹼見件建餞劍薦賤健澗艦漸濺踐鑑鍵箭"};
code char PY_mb_jiang[] ={"江姜將漿僵疆講獎槳蔣匠降醬"};
code char PY_mb_jiao[] ={"交郊嬌澆驕膠椒焦蕉礁角狡絞餃矯腳鉸攪剿繳叫轎較教窖酵覺嚼"};
code char PY_mb_jie[] ={"階皆接秸揭街節劫傑潔結捷睫截竭姐解介戒芥屆界疥誡借"};
code char PY_mb_jin[] ={"巾今斤金津筋襟僅緊謹錦盡勁近進晉浸燼禁靳"};
code char PY_mb_jing[] ={"京經莖荊驚晶睛粳兢精鯨井頸景警淨徑痙競竟敬靖境靜鏡"};
code char PY_mb_jiong[] ={"炯窘"};
code char PY_mb_jiu[] ={"糾究揪九久灸玖韭酒舊臼咎疚廄救就舅"};
code char PY_mb_ju[] ={"居拘狙駒疽鞠局桔菊咀沮舉矩句巨拒具炬俱劇懼據距鋸聚踞"};
code char PY_mb_juan[] ={"娟捐鵑卷倦絹眷"};
code char PY_mb_jue[] ={"撅決訣抉絕倔掘爵攫"};
code char PY_mb_jun[] ={"軍君均鈞菌俊郡峻浚駿竣"};
code char PY_mb_ka[] ={"咖喀卡"};
code char PY_mb_kai[] ={"開揩凱慨楷"};
code char PY_mb_kan[] ={"檻刊勘堪坎砍看"};
code char PY_mb_kang[] ={"康慷糠扛亢抗炕"};
code char PY_mb_kao[] ={"考拷烤靠"};
code char PY_mb_ke[] ={"坷苛柯科棵顆磕殼咳可渴克刻客課"};
code char PY_mb_ken[] ={"肯墾懇啃"};
code char PY_mb_keng[] ={"吭坑"};
code char PY_mb_kong[] ={"空孔恐控"};
code char PY_mb_kou[] ={"摳口扣寇"};
code char PY_mb_ku[] ={"枯哭窟苦庫褲酷"};
code char PY_mb_kua[] ={"誇垮挎胯跨"};
code char PY_mb_kuai[] ={"塊快儈筷"};
code char PY_mb_kuan[] ={"寬款"};
code char PY_mb_kuang[] ={"匡筐狂況曠礦框眶"};
code char PY_mb_kui[] ={"虧巋盔窺奎葵魁傀愧潰饋"};
code char PY_mb_kun[] ={"坤昆捆困"};
code char PY_mb_kuo[] ={"擴括闊廓"};
code char PY_mb_la[] ={"垃拉啦喇臘蠟辣"};
code char PY_mb_lai[] ={"來萊賴"};
code char PY_mb_lan[] ={"蘭攔欄婪闌藍讕瀾籃覽攬纜懶爛濫"};
code char PY_mb_lang[] ={"郎狼廊琅榔朗浪"};
code char PY_mb_lao[] ={"撈勞牢老佬姥澇烙酪"};
code char PY_mb_le[] ={"樂勒了"};
code char PY_mb_lei[] ={"雷鐳壘磊蕾儡肋淚類累擂"};
code char PY_mb_leng[] ={"棱楞冷"};
code char PY_mb_li[] ={"釐梨狸離莉犁漓璃黎籬禮李裏哩理鯉力歷厲立吏麗利勵瀝例隸俐荔慄礫粒傈痢"};
code char PY_mb_lian[] ={"連簾憐漣蓮聯廉鐮斂臉練煉戀鏈"};
code char PY_mb_liang[] ={"倆良涼梁糧粱兩亮諒輛晾量"};
code char PY_mb_liao[] ={"潦遼療聊僚寥廖撩燎鐐料撂"};
code char PY_mb_lie[] ={"列劣烈獵裂"};
code char PY_mb_lin[] ={"鄰林臨淋琳霖磷鱗凜吝賃拎"};
code char PY_mb_ling[] ={"伶靈嶺玲凌鈴陵羚菱零齡領令另"};
code char PY_mb_liu[] ={"溜劉流留琉硫餾榴瘤柳六"};
code char PY_mb_long[] ={"龍嚨籠聾隆窿隴壟攏"};
code char PY_mb_lou[] ={"婁樓摟簍陋漏"};
code char PY_mb_lu[] ={"露盧廬蘆爐顱滷虜擄魯陸錄賂鹿祿碌路戮潞麓"};
code char PY_mb_luan[] ={"孿巒攣灤卵亂"};
code char PY_mb_lue[] ={"掠略"};
code char PY_mb_lun[] ={"掄侖倫淪綸輪論"};
code char PY_mb_luo[] ={"羅蘿邏鑼籮騾螺裸洛絡駱落"};
code char PY_mb_lv[] ={"濾驢呂侶旅鋁屢縷履律慮率綠氯"};
code char PY_mb_ma[] ={"媽麻馬瑪碼螞罵嗎嘛"};
code char PY_mb_mai[] ={"埋買邁麥賣脈"};
code char PY_mb_man[] ={"蠻饅瞞滿曼謾慢漫蔓"};
code char PY_mb_mang[] ={"忙芒盲茫莽氓"};
code char PY_mb_mao[] ={"貓毛矛茅錨卯鉚茂冒貿帽貌"};
code char PY_mb_me[] ={"麼"};
code char PY_mb_mei[] ={"沒枚玫眉梅媒煤酶黴每美鎂妹昧媚寐"};
code char PY_mb_men[] ={"門悶們"};
code char PY_mb_meng[] ={"萌盟檬猛蒙錳孟夢"};
code char PY_mb_mi[] ={"彌迷謎醚糜靡米眯泌覓祕密冪蜜"};
code char PY_mb_mian[] ={"眠綿棉免勉娩冕緬面"};
code char PY_mb_miao[] ={"苗描瞄秒渺藐妙廟"};
code char PY_mb_mie[] ={"滅蔑"};
code char PY_mb_min[] ={"民皿抿閩憫敏"};
code char PY_mb_ming[] ={"名明鳴銘螟命"};
code char PY_mb_miu[] ={"謬"};
code char PY_mb_mo[] ={"貉摸摹模膜摩磨蘑魔抹末沫陌莫寞漠墨默"};
code char PY_mb_mou[] ={"牟謀某"};
code char PY_mb_mu[] ={"母畝牡姆拇木目牧募墓幕睦慕暮穆"};
code char PY_mb_na[] ={"拿哪那納娜鈉吶"};
code char PY_mb_nai[] ={"乃奶氖奈耐"};
code char PY_mb_nan[] ={"男南難"};
code char PY_mb_nang[] ={"囊"};
code char PY_mb_nao[] ={"撓惱腦鬧淖"};
code char PY_mb_ne[] ={"呢"};
code char PY_mb_nei[] ={"內餒"};
code char PY_mb_nen[] ={"嫩"};
code char PY_mb_neng[] ={"能"};
code char PY_mb_ni[] ={"妮尼泥倪霓你擬逆匿溺膩"};
code char PY_mb_nian[] ={"拈年捻攆碾念蔫"};
code char PY_mb_niang[] ={"娘釀"};
code char PY_mb_niao[] ={"鳥尿"};
code char PY_mb_nie[] ={"捏涅聶齧鑷鎳孽"};
code char PY_mb_nin[] ={"您"};
code char PY_mb_ning[] ={"寧擰獰檸凝濘"};
code char PY_mb_niu[] ={"牛扭紐鈕"};
code char PY_mb_nong[] ={"農濃膿弄"};
code char PY_mb_nu[] ={"奴努怒"};
code char PY_mb_nuan[] ={"暖"};
code char PY_mb_nue[] ={"瘧虐"};
code char PY_mb_nuo[] ={"挪諾懦糯"};
code char PY_mb_nv[] ={"女"};
code char PY_mb_o[] ={"哦"};
code char PY_mb_ou[] ={"歐毆鷗嘔偶藕漚"};
code char PY_mb_pa[] ={"趴啪爬耙琶帕怕"};
code char PY_mb_pai[] ={"拍徘排牌派湃"};
code char PY_mb_pan[] ={"潘攀盤磐判叛盼畔"};
code char PY_mb_pang[] ={"乓龐旁耪胖"};
code char PY_mb_pao[] ={"拋刨咆炮袍跑泡"};
code char PY_mb_pei[] ={"呸胚陪培賠裴沛佩配"};
code char PY_mb_pen[] ={"噴盆"};
code char PY_mb_peng[] ={"抨砰烹朋彭棚硼蓬鵬澎篷膨捧碰"};
code char PY_mb_pi[] ={"闢批坯披砒劈霹皮毗疲啤琵脾匹痞屁僻譬"};
code char PY_mb_pian[] ={"片偏篇騙"};
code char PY_mb_piao[] ={"漂飄瓢票"};
code char PY_mb_pie[] ={"撇瞥"};
code char PY_mb_pin[] ={"拼貧頻品聘"};
code char PY_mb_ping[] ={"乒平評憑坪蘋屏瓶萍"};
code char PY_mb_po[] ={"坡潑頗婆迫破粕魄"};
code char PY_mb_pou[] ={"剖"};
code char PY_mb_pu[] ={"脯僕撲鋪莆菩葡蒲樸圃埔浦普譜曝"};
code char PY_mb_qi[] ={"七沏妻柒悽棲戚期欺漆祁齊其奇歧祈臍崎畦騎棋旗乞企豈啓起氣訖迄棄汽泣契砌器"};
code char PY_mb_qia[] ={"掐恰洽"};
code char PY_mb_qian[] ={"千仟扦遷釺牽鉛謙籤前錢鉗乾潛黔淺遣譴欠塹嵌歉"};
code char PY_mb_qiang[] ={"嗆羌槍腔強牆薔搶"};
code char PY_mb_qiao[] ={"悄敲鍬橇喬僑橋瞧巧俏峭竅翹撬鞘"};
code char PY_mb_qie[] ={"切茄且怯竊"};
code char PY_mb_qin[] ={"親侵欽芹秦琴禽勤擒寢沁"};
code char PY_mb_qing[] ={"青氫輕傾卿清情晴氰擎頃請慶"};
code char PY_mb_qiong[] ={"窮瓊"};
code char PY_mb_qiu[] ={"丘邱秋囚求泅酋球"};
code char PY_mb_qu[] ={"區曲驅屈蛆軀趨渠取娶齲去趣"};
code char PY_mb_quan[] ={"圈全權泉拳痊醛顴犬勸券"};
code char PY_mb_que[] ={"炔缺瘸卻雀確鵲榷"};
code char PY_mb_qun[] ={"裙羣"};
code char PY_mb_ran[] ={"然燃冉染"};
code char PY_mb_rang[] ={"瓤嚷壤攘讓"};
code char PY_mb_rao[] ={"饒擾繞"};
code char PY_mb_re[] ={"惹熱"};
code char PY_mb_ren[] ={"人仁壬忍刃認任紉妊韌"};
code char PY_mb_reng[] ={"扔仍"};
code char PY_mb_ri[] ={"日"};
code char PY_mb_rong[] ={"戎絨茸榮容溶蓉熔融冗"};
code char PY_mb_rou[] ={"柔揉肉"};
code char PY_mb_ru[] ={"如茹儒孺蠕汝乳辱入褥"};
code char PY_mb_ruan[] ={"阮軟"};
code char PY_mb_rui[] ={"蕊銳瑞"};
code char PY_mb_run[] ={"閏潤"};
code char PY_mb_ruo[] ={"若弱"};
code char PY_mb_sa[] ={"撒灑薩"};
code char PY_mb_sai[] ={"塞腮鰓賽"};
code char PY_mb_san[] ={"三叄傘散"};
code char PY_mb_sang[] ={"桑嗓喪"};
code char PY_mb_sao[] ={"搔騷掃嫂"};
code char PY_mb_se[] ={"色澀瑟"};
code char PY_mb_sen[] ={"森"};
code char PY_mb_seng[] ={"僧"};
code char PY_mb_sha[] ={"殺沙紗砂莎傻啥煞廈"};
code char PY_mb_shai[] ={"篩曬"};
code char PY_mb_shan[] ={"山刪杉衫珊煽閃陝汕苫扇善繕擅膳贍柵"};
code char PY_mb_shang[] ={"傷商墒裳晌賞上尚"};
code char PY_mb_shao[] ={"捎梢燒稍勺芍韶少邵紹哨"};
code char PY_mb_she[] ={"奢賒舌蛇舍設社射涉赦懾攝"};
code char PY_mb_shen[] ={"申伸身呻紳娠砷深神沈審嬸腎甚滲慎什"};
code char PY_mb_sheng[] ={"升生聲牲勝甥繩省聖盛剩"};
code char PY_mb_shi[] ={"匙屍失師蝨詩施獅溼十石時識實拾蝕食史矢使始駛屎士氏世仕市示式事侍勢視試飾室恃拭是柿適逝釋嗜誓噬似"};
code char PY_mb_shou[] ={"收手守首壽受獸售授瘦"};
code char PY_mb_shu[] ={"書抒叔樞殊梳淑疏舒輸蔬孰贖熟暑黍署鼠蜀薯曙術戍束述樹豎恕庶數墅漱屬"};
code char PY_mb_shua[] ={"刷耍"};
code char PY_mb_shuai[] ={"衰摔甩帥"};
code char PY_mb_shuan[] ={"拴栓"};
code char PY_mb_shuang[]={"雙霜爽"};
code char PY_mb_shui[] ={"誰水稅睡"};
code char PY_mb_shun[] ={"吮順舜瞬"};
code char PY_mb_shuo[] ={"說爍朔碩"};
code char PY_mb_si[] ={"絲司私思斯嘶撕死巳四寺伺飼嗣肆"};
code char PY_mb_song[] ={"松慫聳訟宋誦送頌"};
code char PY_mb_sou[] ={"嗽搜艘擻"};
code char PY_mb_su[] ={"蘇酥俗訴肅素速粟塑溯僳"};
code char PY_mb_suan[] ={"酸蒜算"};
code char PY_mb_sui[] ={"雖綏隋隨髓歲祟遂碎隧穗"};
code char PY_mb_sun[] ={"孫損筍"};
code char PY_mb_suo[] ={"唆梭蓑縮所索瑣鎖"};
code char PY_mb_ta[] ={"她他它塌塔獺撻踏蹋"};
code char PY_mb_tai[] ={"胎臺擡苔太汰態泰酞"};
code char PY_mb_tan[] ={"坍貪攤灘癱壇談痰譚潭檀坦袒毯嘆炭探碳"};
code char PY_mb_tang[] ={"湯唐堂棠塘搪膛糖倘淌躺燙趟"};
code char PY_mb_tao[] ={"濤絛掏滔逃桃陶淘萄討套"};
code char PY_mb_te[] ={"特"};
code char PY_mb_teng[] ={"疼騰謄藤"};
code char PY_mb_ti[] ={"剔梯銻踢啼提題蹄體屜剃涕惕替嚏"};
code char PY_mb_tian[] ={"天添田恬甜填腆舔"};
code char PY_mb_tiao[] ={"調挑條迢眺跳"};
code char PY_mb_tie[] ={"貼鐵帖"};
code char PY_mb_ting[] ={"廳汀聽烴廷亭庭停挺艇"};
code char PY_mb_tong[] ={"通同彤桐銅童酮瞳統捅桶筒痛"};
code char PY_mb_tou[] ={"偷頭投透"};
code char PY_mb_tu[] ={"凸禿突圖徒塗途屠土吐兔"};
code char PY_mb_tuan[] ={"湍團"};
code char PY_mb_tui[] ={"推頹腿退蛻褪"};
code char PY_mb_tun[] ={"囤吞屯臀"};
code char PY_mb_tuo[] ={"託拖脫馱陀駝鴕妥橢拓唾"};
code char PY_mb_wa[] ={"哇娃挖窪蛙瓦襪"};
code char PY_mb_wai[] ={"歪外"};
code char PY_mb_wan[] ={"彎灣豌丸完玩頑烷宛挽晚婉惋皖碗萬腕"};
code char PY_mb_wang[] ={"汪亡王網往枉妄忘旺望"};
code char PY_mb_wei[] ={"危威微巍爲韋圍違桅唯惟維濰偉僞尾緯葦委萎衛未位味畏胃尉謂喂渭蔚慰魏"};
code char PY_mb_wen[] ={"溫瘟文紋聞蚊吻紊穩問"};
code char PY_mb_weng[] ={"翁嗡甕"};
code char PY_mb_wo[] ={"撾渦窩蝸我沃臥握斡"};
code char PY_mb_wu[] ={"烏污嗚巫屋誣鎢無毋吳吾蕪梧五午伍塢武侮捂舞勿務戊物誤悟晤霧"};
code char PY_mb_xi[] ={"夕汐西吸希昔析矽息犧悉惜烯硒晰犀稀溪錫熄熙嘻膝習席襲媳檄洗喜戲系細隙"};
code char PY_mb_xia[] ={"蝦瞎匣俠峽狹暇轄霞下嚇夏"};
code char PY_mb_xian[] ={"銑仙先纖掀杴鮮閒弦賢鹹涎舷銜嫌顯險縣現線限憲陷餡羨獻腺"};
code char PY_mb_xiang[] ={"鄉相香廂湘箱襄鑲詳祥翔享響想向巷項象像橡"};
code char PY_mb_xiao[] ={"宵消蕭硝銷霄囂淆小曉孝肖哮效校笑嘯"};
code char PY_mb_xie[] ={"些楔歇蠍協邪脅斜諧攜鞋寫泄瀉卸屑械謝懈蟹"};
code char PY_mb_xin[] ={"心忻芯辛欣鋅新薪信釁"};
code char PY_mb_xing[] ={"興星惺猩腥刑邢形型醒杏姓幸性"};
code char PY_mb_xiong[] ={"兇兄匈洶胸雄熊"};
code char PY_mb_xiu[] ={"宿休修羞朽秀繡袖鏽嗅"};
code char PY_mb_xu[] ={"戌須虛噓需墟徐許旭序敘恤緒續酗婿絮蓄籲"};
code char PY_mb_xuan[] ={"軒宣喧玄懸旋選癬絢眩"};
code char PY_mb_xue[] ={"削靴薛穴學雪血"};
code char PY_mb_xun[] ={"勳薰尋巡旬馴詢循訓訊汛迅遜殉"};
code char PY_mb_ya[] ={"丫壓呀押鴉鴨牙芽蚜崖涯衙啞雅亞訝"};
code char PY_mb_yan[] ={"咽煙淹焉閹延嚴言巖沿炎研鹽閻蜒顏奄衍掩眼演厭彥硯唁宴豔驗諺堰焰雁燕"};
code char PY_mb_yang[] ={"央殃秧鴦揚羊陽楊佯瘍洋仰養氧癢樣漾"};
code char PY_mb_yao[] ={"僥妖腰邀堯姚窯謠搖遙瑤咬舀藥要耀鑰"};
code char PY_mb_ye[] ={"椰噎爺耶也冶野業葉曳頁夜掖液腋"};
code char PY_mb_yi[] ={"一伊衣醫依銥壹揖儀夷沂宜姨胰移遺頤疑彝乙已以矣蟻倚椅義億憶藝議亦屹異役抑譯邑易繹詣疫益誼翌逸意溢肄裔毅翼臆"};
code char PY_mb_yin[] ={"因陰姻茵蔭音殷吟寅淫銀尹引飲隱印"};
code char PY_mb_ying[] ={"應英嬰纓櫻鷹迎盈熒瑩螢營蠅贏穎影映硬"};
code char PY_mb_yo[] ={"喲"};
code char PY_mb_yong[] ={"傭擁癰庸雍臃永詠泳勇湧恿蛹踊用"};
code char PY_mb_you[] ={"優憂幽悠尤由猶郵油鈾遊友有酉又右幼佑誘釉"};
code char PY_mb_yu[] ={"迂淤渝於予餘盂魚俞娛漁隅愉逾愚榆虞輿與宇嶼羽雨禹語玉馭芋育鬱獄峪浴預域欲喻寓御裕遇愈譽豫"};
code char PY_mb_yuan[] ={"冤鴛淵元員園垣原圓袁援緣源猿轅遠苑怨院願"};
code char PY_mb_yue[] ={"樂曰約月嶽悅閱躍粵越鑰"};
code char PY_mb_yun[] ={"雲勻鄖耘允隕孕運暈醞韻蘊"};
code char PY_mb_za[] ={"匝雜砸咋"};
code char PY_mb_zai[] ={"災哉栽宰載再在仔"};
code char PY_mb_zan[] ={"咱攢暫贊"};
code char PY_mb_zang[] ={"贓髒葬"};
code char PY_mb_zao[] ={"遭糟鑿早棗蚤澡藻竈皁造噪燥躁"};
code char PY_mb_ze[] ={"則擇澤責"};
code char PY_mb_zei[] ={"賊"};
code char PY_mb_zen[] ={"怎"};
code char PY_mb_zeng[] ={"增憎贈"};
code char PY_mb_zha[] ={"喳渣扎札軋閘鍘眨乍詐炸榨柞"};
code char PY_mb_zhai[] ={"齋摘宅翟窄債寨"};
code char PY_mb_zhan[] ={"沾氈粘詹瞻斬展盞嶄輾佔戰棧站綻湛蘸"};
code char PY_mb_zhang[] ={"長張章彰漳樟漲掌丈仗帳杖脹賬障瘴"};
code char PY_mb_zhao[] ={"招昭找沼召兆趙照罩肇爪"};
code char PY_mb_zhe[] ={"遮折哲蟄轍者鍺這浙蔗着"};
code char PY_mb_zhen[] ={"貞針偵珍真砧斟甄臻診枕疹陣振鎮震幀"};
code char PY_mb_zheng[] ={"爭徵怔掙猙睜蒸拯整正證鄭政症"};
code char PY_mb_zhi[] ={"之支汁芝吱枝知織肢脂蜘執侄直值職植殖止只旨址紙指趾至志制幟治炙質峙摯秩致擲痔窒智滯稚置"};
code char PY_mb_zhong[] ={"中忠終盅鍾衷腫種仲衆重"};
code char PY_mb_zhou[] ={"州舟謅周洲粥軸肘帚咒宙晝皺驟"};
code char PY_mb_zhu[] ={"朱誅株珠諸豬蛛竹燭逐主拄煮囑矚住助注貯駐柱祝著蛀築鑄"};
code char PY_mb_zhua[] ={"抓"};
code char PY_mb_zhuai[] ={"拽"};
code char PY_mb_zhuan[] ={"專磚轉撰篆"};
code char PY_mb_zhuang[]={"妝莊樁裝壯狀幢撞"};
code char PY_mb_zhui[] ={"追椎錐墜綴贅"};
code char PY_mb_zhun[] ={"諄準"};
code char PY_mb_zhuo[] ={"卓拙捉桌灼茁濁酌啄琢"};
code char PY_mb_zi[] ={"孜茲諮姿資淄滋籽子紫滓字自漬"};
code char PY_mb_zong[] ={"宗綜棕蹤鬃總縱"};
code char PY_mb_zou[] ={"鄒走奏揍"};
code char PY_mb_zu[] ={"租足卒族詛阻組祖"};
code char PY_mb_zuan[] ={"賺纂鑽"};
code char PY_mb_zui[] ={"嘴最罪醉"};
code char PY_mb_zun[] ={"尊遵"};
code char PY_mb_zuo[] ={"昨左佐作坐座做"};
code char PY_mb_space[] ={""};
用拼音輸入法字典庫實現同音字模糊查詢
文/王守銀
在開發各類應用管理系統中,一般都要實現各種查詢功能,如何準確、快速查找到符合條件的記錄,是實現各種查詢功能的重點。系統的實際開發過程中,查詢功能一般都是通過對字符進行比較、判斷等方法來實現。我們開發一個人事管理系統中過程中,系統要具有新的查詢方式,即只要知道一個人姓名的讀音,並不知道每個字的具體寫法,通過檢索數據庫,就能把所有符合這個讀音的記錄內容全部顯示出來。由於漢字存在着大量的同音字,採用常用的字符比較法,如查找一個名叫“李曉軍”的人,數據庫中存在的叫“李小君”的數據就不能查到,利用常用的查詢方法實現不了同音字的查詢功能。爲了解決同音字的模糊查詢問題,筆者借用WINDOWS系統下的輸入法生成器,將系統中的拼音輸入法字典庫,生成了一個拼音查詢字典庫,利用這個拼音查詢字典庫,在使用VFP數據庫管理系統編寫的人事管理系統中,輕鬆實現了按語音進行模糊查詢功能,具體思路如下:
---- 一、首先要生成一個拼音字典查詢數據庫
---- 選擇WINDOWS系統的開始—程序—附件—輸入法生成器,進入輸入法生成器窗口,使用鼠標點擊逆轉換的頁框,點擊打開文件按鈕,選中硬盤WINDOWS/SYSTEM文件夾下的WINPY.MB文件,在碼錶原文件中輸入C:/WINPY.TXT,輸入完畢後點擊逆轉換,此時系統對全拼字典庫進行轉換,最後將生成一個純文本文件,利用這個純文本文件編寫一段小程序即可生成一個拼音字典查詢數據庫。
---- 二、進入VFP系統,編寫一段生成程序命令爲ZH.PRG
---- 程序中的內容如下所列:
---- CREA TABL B1 (NR C(60),HZ C(2),PY1 C(12),PY2 C(12))&&創建一個臨時數據庫
---- USE B1 &&打開生成的數據庫
---- APPE FROM C:/WINPY.TXT SDF
---- &&將利用輸入法生成器生成的字典碼文件WINPY.TXT文件內容追加到數據庫中
---- DELE FOR ASC(SUBS(NR,3,1)) >=128
---- &&在數據庫中刪除全部詞組內容,只留下單字 DELE FOR RECN()< 13 &&在數據庫刪除編碼庫的頭文件
---- PACK &&清除打了刪除標記的記錄。
---- REPL HZ WITH SUBS(NR,1,2),PY1 WITH SUBS(NR,3,AT(' ',NR)-2),;
---- PY2 WITH SUBS(NR,AT(' ',NR)+1) ALL
---- &&將漢字與拼音存放在不同的字段裏,這裏拼音有兩個字段,其中有一個爲同音字。
---- REPL NR1 WITH ‘s’+SUBS(NR1,3) FOR “sh”$NR1
---- &&爲了照顧南方口音的人員使用,可將全部zh,ch,sh替換成z,c,s
---- REPL NR1 WITH ‘c’+SUBS(NR1,3) FOR “ch”$NR1
---- REPL NR1 WITH ‘z’+SUBS(NR1,3) FOR “zh”$NR1
---- REPL NR2 WITH ‘s’+SUBS(NR2,3) FOR “sh”$NR2
---- REPL NR2 WITH ‘c’+SUBS(NR2,3) FOR “ch”$NR2
---- REPL NR2 WITH ‘z’+SUBS(NR2,3) FOR “zh”$NR2
---- COPY TO PYZDK FIEL HZ,PY1,PY2 &&生成一個拼音查詢數據庫
---- USE &&關閉打開的數據庫
---- ERASE 'B1.DBF' &&刪除生成的臨過數據庫
---- 在VFP中命令窗口中,執行上面這段程序系統將自動生成一個拼音查詢庫,並將這個數據庫命名爲PYZDK.DBF。
---- 三、新建一個表單
---- 在數據環境中加入“人員情況表”和“PYZDK”,兩個數據庫,在人員情況表中存在需要有查詢的人員姓名字段,字段名爲NAME,標誌位字段,字段名爲BZW。
---- 在表單上新建一個LABEL1對象用來提示“請輸入要查詢的姓名”;一個文本框用來輸入要查詢的字符內容;一個表格對像,用來顯示人員情況表數據庫中的內容,兩個命令按鈕,COMMAND2用來執行查詢過程文件,COMMAND1用來退出查詢窗口。
---- COMMAND1命令按鈕屬性設置如下:
COMMAND1.CAPTION=’退出’
在COMMAND1命令按鈕的.CLICK事件中寫入代碼
THISFORM.RELEASE
COMMAND2命令按鈕屬性設置如下:
COMMAND2.CAPTION=’開始查詢’
在COMMAND2命令按鈕的CLICK事件中寫入代碼:
IF THIS.CAPTION='開始查詢'
THIS.CAPTION='恢復數據'
SRNR=ALLT(THISFORM.TEXT1.VALUE)
ZDD=LEN(SRNR)/2
DIME HH(100)
HH=''
FOR I=1 TO LEN(SRNR)/2
ABC=SUBS(SRNR,I*2-1,2)
SELE PYZDK
SET FILT TO
LOCA FOR ABC$HZ
PYNR1=PY1
PYNR2=PY2
IF PYNR2< >' '
SET FILT TO PY1=PYNR1 OR PY2=PYNR2
ELSE
SET FILT TO PY1=PYNR1
ENDIF
GO TOP
DO WHIL NOT EOF()
HH(I)=HH(I)+HZ
SKIP
ENDDO
ENDFOR
SELE 人員情況表
SET FILT TO
REPL BZW WITH '' ALL
GO TOP
DO WHIL NOT EOF()
JSQ=0
FOR I=1 TO LEN(ALLT(NAME))/2
IF SUBS(YXMM,I*2-1,2)$HH(I)
JSQ=JSQ+1
ENDIF
ENDFOR
IF JSQ=LEN(ALLT(NAME))/2 OR JSQ >=ZDD
REPL BZW WITH '*'
ENDIF
SKIP
ENDDO
SET FILT TO BZW="*"
THISFORM.REFRESH
ELSE
THIS.CAPTION='開始查詢'
SELE 人員情況表
SET FILT TO
GO TOP
THISFORM.REFRESH
ENDIF
---- 全部設置完畢後,執行這個程序,在文本框中輸入要查詢的關鍵字,點擊查詢命令按鈕,這時表格中顯示的將是符合查詢關鍵字的全部內容,再次點擊這個命令按鈕,表格中將恢復顯示全部數據內容,點擊退出系統命令按鈕,將退出系統。
---- 四、查詢程序實現的原理
---- 在系統中提供的編輯框中輸入要查詢的關鍵字,如果在一個人員數據庫中查詢一個姓名音爲“李曉軍”的人員,首先在生成的拼音查詢數據庫中找輸入第一個漢字在字典庫中的位置,利用這個漢字的讀音,對字典庫記錄內容進行過濾,這樣字典庫中只有符合這個漢字讀音的全部漢字,利用一個循環,將全部同音字相加生成一個字符串送到一個變量中,繼續對另外輸入的漢字進行同樣的處理,最後根據輸入漢字的多少,生成多個字符串變量。生成字符串變量後,開始檢索你要查詢的數據庫,將數據庫中每人的姓名拆開分別與生成的字符串進行判斷,只有當數據庫中一個人的姓名全部字符都能在相應的字符串中查找到,那麼這條記錄就符合查找的條件,打上一個標識,比較下一條記錄,循環到數據庫的結尾,這時就可以將所有做了查詢標記的數據庫內容顯示出來,即實現了按語音模糊查詢的方法。
---- 上面簡要介紹了在VFP系統中,實現按語音模糊查詢的一種方法,在程序中並沒有考慮容錯性,在這裏只是提供了一種思路,讀者根據以上實現語音查詢的原理,根據實際工作的需要實現不同形式的語音模糊查詢方式。
/*
手機的漢字拼音輸入法很'聰明',只要用數字鍵組合,就能夠自動找到能組成拼音的字母組合。
從2代表abc,3:def,4:ghi,5:jkl,6:mno,7:pqrs,8:tuv,9:wxyz
寫一個程序,對輸入的數字組合,找到匹配的字母組合成拼音輸出。
如果有多個匹配則按照字母順序排列後輸出。
*/
#pragma warning(disable:4786)
#include <cstdio>
#include <cassert>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
class NameList
{ public:
void init()
{
string a;
for (int j = 0; ym[j]; j++)
{
a = ym[j];
mStrs.push_back(a);
for (int i = 0; sm[i]; i++)
{
a = sm[i];
a += ym[j] ;
mStrs.push_back(a);
}
}
}
void load(const char *file)
{
char buf[128];
char buf2[1024];
string a;
mStrs.clear();
mStrGBs.clear();
FILE *fp = fopen(file,"rt");
while(fscanf(fp, "%s %s", buf, buf2) == 2)
{
a = buf;
mStrs.push_back(a);
a = buf2;
mStrGBs.push_back(a);
}
fclose(fp);
}
void show()
{
for (vector< string >::iterator s = mStrs.begin(); s != mStrs.end(); ++s)
{
printf("%s ", s->c_str());
}
}
vector< string > mStrs;
vector< string > mStrGBs;
private:
static const char *sm[];
static const char *ym[];
};
const char *NameList::sm[]=
{ "b","p","m","f","d", "t","n","l","g","k",
"h","j","q","x","z", "c","s","zh","ch","sh",
"r","y","w",
NULL,
};
const char *NameList::ym[]=
{ "a","ai","ao","an","ang",
"o","ou","ong",
"e","ei","er","en","eng",
"i","iang","ian","iao","in","ing","iu","ia","ie","iong",
"u","uo","uang","un","uai","uan",
"ui","ue","ua",
NULL,
};
class Digit2PinyinConverter
{ public:
struct StrCmpFunctor
{
operator () (const char *s1, const char *s2)
{
int len1 = strlen(s1);
int len2 = strlen(s2);
if (len1 != len2)
return len1 < len2;
return strcmp(s1, s2) < 0;
}
};
void init()
{
validStrings.clear();
vector< string >::iterator name = namelist.mStrs.begin();
while(name != namelist.mStrs.end())
{
validStrings.push_back(name->c_str());
++name;
}
digits = "";
sort(validStrings.begin(), validStrings.end(), StrCmpFunctor());
}
/**//// @param char digit '2'..'9'
void push(char digit)
{
if (digit < '2' || digit > '9')
return;
digits += digit;
vector< const char * > next;
vector< const char * >::iterator name = validStrings.begin();
while(name != validStrings.end())
{
if (match(*name, digits.size() - 1, digit))
{
next.push_back(*name);
}
++name;
}
validStrings = next;
sort(validStrings.begin(), validStrings.end(), StrCmpFunctor());
}
void show()
{
printf("+-------+-------+-------+/n");
printf("| |2 abc |3 def |/n");
printf("+-------+-------+-------+/n");
printf("|4 ghi |5 jkl |6 mno |/n");
printf("+-------+-------+-------+/n");
printf("|7 pqrs |8 tuv |9 wxyz |/n");
printf("+-------+-------+-------+/n");
printf("|-<prep>|0<back>|+<next>|/n");
printf("+-------+-------+-------+/n");
}
string digits;
vector< const char * > validStrings;
static NameList namelist;
private:
bool match(const char *name, int pos, char digit)
{
assert(digit >= '0' && digit <= '9');
int len = strlen(name);
if (len <= pos)
return false;
char d = name[pos];
const char *maplist = map[digit - '0'];
for (; *maplist; maplist++)
{
if (d == *maplist)
return true;
}
return false;
}
static const char *map[10];
};
const char *Digit2PinyinConverter::map[10]=
{ "", "","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"
};
NameList Digit2PinyinConverter::namelist;
int main()
{ char c = '0';
int page = 0;
int i;
Digit2PinyinConverter converter;
Digit2PinyinConverter::namelist.load("pinyin2.txt");
converter.init();
do
{
if (c == '/n')
continue;
if (c == '0')
converter.init();
if (c == '+')
{
page++;
int maxpage = (converter.validStrings.size() + 9)/10;
if (page > maxpage)
page = maxpage;
}
if (c == '-' && page > 0)
page--;
if (c >= '2' && c <= '9')
{
page = 0;
converter.push(c);
}
system("cls");
converter.show();
for (i = 0; i < (int)converter.digits.size(); i++)
printf("%c", converter.digits[i]);
printf("/n");
for (i=0;i<10 && i + page * 10 < (int)converter.validStrings.size();i++)
{
if (strlen(converter.validStrings[i + page * 10]) > strlen(converter.digits.c_str()))
break;
printf("%d:%s ", i, converter.validStrings[i + page * 10]);
}
printf("/nPage %d, Total %d/n", page, converter.validStrings.size());
} while(scanf("%c", &c) == 1);
return 0;
}
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/yhmhappy2006/archive/2007/04/12/1561644.aspx