全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:4389
推到 Plurk!
推到 Facebook!

漢字信息按姓氏筆劃排序的實現方法和技巧

 
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-12-09 09:17:23 IP:61.218.xxx.xxx 未訂閱

漢字信息按姓氏筆劃排序的實現方法和技巧

=========================================================
An Approach for Implementing Chinese string sorted by Chinese strokes 西北電力設計院(陝西﹒西安) 任增勝 西安交通大學9500#(陝西﹒西安) 陳士宏 資料來源:http://www.powerba.com/develop/c&c /article/20010704005.htm 在信息處理中,常會遇到對中文信息按某種要求進行排序,例如對姓名按姓氏筆劃排序。而中文信息的排序較英文信息的排序要復雜許多,ASC II編碼的有序性大大方便英文信息排序的實現,那麼要實現中文信息的按筆劃排序,就得對中文信息進行重新編碼,這裡的編碼是指將漢字的內碼信息轉換為漢字按筆劃排序的序號信息,新生成的編碼信息可按ASC II前後次序進行排序,從而實現漢字信息的姓氏筆劃排序。 為了實現漢字信息按姓氏筆劃排序,首先需要創建一個全部漢字信息按姓氏筆劃排序的文本文件,然後根據該文本文件的漢字筆劃排序的序號信息建立漢字--筆劃編碼數據庫文件,那麼對指定的漢字信息字符串按漢字--筆劃編碼表轉換成為按筆劃排序漢字的編碼字符串,隻需對編碼字符串進行排序,就可實現漢字信息按筆劃排序的目的。 以Dephi 與SQL Server為例介紹實現上述方法的過程: 第一步、要創建一個全部漢字信息按姓氏筆劃排序的文本文件,可以利用Microsoft Word 6.0提供的按筆劃排序的功能。先用任何一種熟悉的高級編程語言編寫一段能生成全部漢字內碼的小程序(別忘了一個漢字一行),用來生成一個按姓氏筆劃排序的文本文件。然後在Word中打開該文件,並選擇"表格\排序文字[T]..."這一菜單項,將彈出一個對話框,這時隻需將排序依據的類型設為"筆劃"後按"確定"按鈕,那麼就可以得到一份按姓氏筆劃排序的全部漢字的文本文件。 第二步:建立漢字--筆劃編碼數據庫文件 最簡單的實現方法是用數據庫直接記錄漢字信息及其它的序號,從而形成編碼表文件。中文系統中編碼漢字的總數大約7000個左右,那麼就意味?序號需以長度為4 字節的字符串形式存放,才能保証漢字排序的統一性、可靠性。對於一個5個漢字的字串而言,就得附加20字節的編碼信息用於筆劃排序。為了節約存貯空間,可採用百進制編碼方式表示漢字的序號。因為兩位百進制數可以表示十進制數的范圍是0~9999,那麼隻需用兩個字符用來分別存放百進制數的第一位和第二位,就可以表示任何一個漢字的序號,而且這種編碼顯示是有序的(因為ASCII碼是有序的)。同樣的一個5個漢字的字串現在隻需附加一個10字節的編碼信息用於筆劃排序,比起上一種方法,採用百進制編碼方式可節約一半的存貯空間,尤其當數據庫需排序的中文信息量較大,做這樣的節約是非常值得的。 漢字--筆劃編碼數據庫文件:Hzcodedb 其結構為:
HZ CHAR 2
HZCODE CHAR 2
{建立漢字--筆劃編碼表}
hzsrc:Ttable;{按姓氏筆劃排序的全部漢字信息文本文件,在Delphi 中可將文本文件按Table處理}
hzcodedb:Ttable; // 需生成的漢字--筆劃編碼數據庫
var
tmp1,tmp2:string;
i,k,j:integer;
begin
hzsrc.open;
hzcoded8b.open;
i:=0;
tmp:='';tmp1:='';
Hzsrc.first;
while not HzSrc.eof do
begin
i:=i 1;
k:=(i div 100);
tmp1:=char(k 23); //first char
j:=i-k*100;
tmp2:=char(j 23); //second char
tmp:=tmp1 tmp2;
hzcodedb.append;
hzcodedb.edit;
hzcodedb['hz']:=hzsrc['field1'];
hzcodedb.fieldbyname('hzcode').asstring:=tmp;
hzcodedb.post;
hzsrc.next;
end;
hzcodedb.close
hzsrc.close;
end;
第三步:建立函數HZconvert( hzstring ),將指定的漢字信息字符串hzstring轉換成為按筆劃排序漢字的編碼字符串。    Fuction HZconvert( hzstring: string ) : string ; 
var
hzorder:string;
tmp:string;
i,startindex:integer;
begin
i:=length(hzstring);
startindex:=1;
hzorder:='';
while (startindex<=i) do
begin
tmp:=copy(hzstring,startindex,2);
startindex:=startindex 2;
if hzcodedb.findKey([tmp]) then
hzorder:=hzOrder hzcodedb['hzorder']
else
hzorder:=hzOrder 'zz';
end; // end of while
HZconvert:=hzorder; 
end;// end of function
在開發應用程序的過程中,以姓名的姓氏筆劃排序為例,介紹HZconvert函數使用。 在數據庫結構中,應包括以下的兩項: 姓名(NAME) VARCHAR 30 姓名編碼(NAMEORDER) VARCHAR 30 VARCHAR是可變長字臟篜型,定義姓名為VARCHAR類型是考慮到姓名的長短不一,為了能既節約空間,又可以輸入較長的姓名,而定義姓名為VARCHAR類型。 Delphi中隻需在TTABLE元件的BeforePost 事件中加入以下的代碼就可生成姓名的筆劃編碼: table1['nameorder']:=HZconvert(table1['name']); 數據庫內容建立完畢後,設置NameOrder為Index,就實現了姓名的按姓氏筆劃排序。 (全文完) _________________________________________________________ 通訊地址: 陝西省西安市金花北路20號 西北電力設計院出版處 ( 710032 ) 任增勝(收) E-mail: csh@citi.xjtu.edu.cn shq@nwu.edu.cn 聯盟----Visita網站http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]---
ralph
初階會員


發表:41
回覆:82
積分:29
註冊:2003-02-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-02-13 09:20:26 IP:66.171.xxx.xxx 未訂閱
why I can not read whole document?
系統時間:2024-04-26 14:06:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!