社区
Delphi
帖子详情
关于按姓名笔划排序的问题
SunRoll
2001-10-27 10:32:51
我的SQL SERVER数据库中有一个表中有一个varchar型的字段"姓名",现要求用此字段中姓名笔划来排序,请问该怎么办?
...全文
325
5
打赏
收藏
关于按姓名笔划排序的问题
我的SQL SERVER数据库中有一个表中有一个varchar型的字段"姓名",现要求用此字段中姓名笔划来排序,请问该怎么办?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
lxl
2001-11-14
打赏
举报
回复
抄自大富翁:
在信息处理中,常会遇到对中文信息按某种要求进行排序,例如对姓名按姓氏笔划排
序。而中文信息的排序较英文信息的排序要复杂许多,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,就实现了姓名的按姓氏笔划排
序。
jspxnet
2001-10-28
打赏
举报
回复
gz
Nizvoo
2001-10-28
打赏
举报
回复
直接排序不行?
machin
2001-10-28
打赏
举报
回复
order by 姓名
不行吗??
smhjh
2001-10-27
打赏
举报
回复
关注,我也想知道
笔画数 笔顺库 按
姓名
笔画
排序
偏旁部首
【笔画数 笔顺库 按
姓名
笔画
排序
偏旁部首】txt文档无需安装任何文件,用excel 数据分列即可。
姓名
笔画
排序
软件
为多人名
排序
,用于组织人名等, 拼音 笔画 等模式。
职场办公Excel技巧精粹灵活妙用集锦
第19节:按
姓名
或中文汉字笔画进行
排序
l 第20节: 按单元格颜色进行
排序
l 第21节:excel按行也可以
排序
l 第22节: excel中的数据快速条件筛选 l 第23节:巧妙删除带有空格的单元格所在的行的...
简体汉字笔画查询与
姓名
笔画
排序
源代码
可以实现汉字笔画查询与
姓名
笔画
排序
,该源代码在Delphi xe2下通过测试。
按汉字笔画
排序
这个小工具可以用来给名字或者姓氏按笔画多少
排序
,非常好用。
Delphi
5,388
社区成员
262,730
社区内容
发帖
与我相关
我的任务
Delphi
Delphi 开发及应用
复制链接
扫一扫
分享
社区描述
Delphi 开发及应用
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章