李先静的专栏

欢迎大家加入Linux Mobile Research,本圈子主要致力于基于linux的嵌入式系统的学习和研究,包括内核、驱动、GUI、MMI、软件设计方法和软件优化等方面,欢迎大家加入,无论是高手还是新手,一起学习共同进步。个人网站上线:http://www.limodev.cn

用户操作
[即时聊天] [发私信] [加为好友]
李先静ID:absurd
1017426次访问,排名26好友231人,关注者236
Only those who attempt the absurd can achieve the impossible.
absurd的文章
原创 384 篇
翻译 1 篇
转载 57 篇
评论 1513 篇
李先静的公告
个人网站上线: http://www.limodev.cn,以后BLOG将在CSDN和limodev上同时更新,欢迎交流,评论和交换友情链接。
最近评论
securitydoor:加油哦
SuperKris:应该把rootfs里的/var/tmp改成是指向/tmp的连接,
别的程序也可能用/var/tmp保存临时文件,好像pppd这个拨号程序就是
creative55:牛人,佩服。
Nick518:即将实现MTK方案动态加载,到时候可以无限扩展手机功能. 哈哈
AntiSoul:不错,这些是什么方面的开发?
文章分类
收藏
相册
1.个人相册
2.设计备忘录用图
3.设计本质论用图
4.scim架构用图
6.临时文件
7.其它文件
8.研究笔记用图
marvell-linux
1.友情链接
aimself@CSDN(RSS)
directfb中文网站(RSS)
Eric's Little Hut
eye_of_back的专栏(RSS)
Linux Mobile Research
Phoenix@上海(RSS)
segments的专栏(RSS)
study's Blog(RSS)
tracestudio
伐木丁丁鸟鸣嘤嘤(RSS)
会飞的鱼的专栏(RSS)
创系的技术博客
小四的BLOG(RSS)
小马哥的博客(RSS)
开源电信(RSS)
御风剑客
新奇的BLOG
易军军的网络家
李吉群的专栏(RSS)
2.亲情链接
凤凰的幸福蓄水池(RSS)
我的相册
3.软界高手
Donald E. Knuth (RSS)
孟岩(RSS)
透明(RSS)
4.LinuxMobile
celinuxforum(RSS)
GPE(RSS)
maemo.org(RSS)
opensource.motorola
palowireless
5.XWindow
Jserv's blog(RSS)
Keith Packard(RSS)
6.技术资源
7.开源项目
freedesktop(RSS)
GNU(RSS)
GTK+(RSS)
matchbox(RSS)
pxa27x-linux/
8.我的BLOG镜像
absurd@chinaunix
absurd@msn
My English BLOG(RSS)
存档
订阅我的博客
XML聚合  FeedSky

原创 [open source] 拼音排序函数库发布收藏

新一篇: Linux电源管理研究笔记—动态电源管理(DPM) | 旧一篇: Sqlite中文排序研究

[open source] 拼音排序函数库发布

 

转载时请注明出处和作者联系方式:http://blog.csdn.net/absurd

作者联系方式:Li XianJing <xianjimli at hotmail dot com>

更新时间:2006-12-19

 

最近在做资源管理器的设计,SPEC要求中文文件名按拼音排序。于是花了点时间去研究关于拼音排序的问题,然后又花了两小时写了一个函数库。其实知道了原理,按拼音排序的实现很简单,放到这里供大家参考吧。

 

我们知道,计算机中的每一个字符都有一个内码。在默认情况下,计算机排序时,比较两个字符的大小就是比较字符内码的大小,这对于英文来说没有问题,因为英文字母的内码是按字母顺序递增的。对于中文来说,就比较麻烦了:首先,中文的排序方式有多种,比如按内码排序、按拼音排序和按笔画排序,要通过参数指定排序的方式,否则计算机就按内码排序了。其次,汉字的内码顺序即不同于拼音顺序,也不同于按笔画顺序。在GB2312编码中,汉字基本上按拼音排序(据说有例外,不太清楚)。在GBK中,它在GB2312基础上进行了扩充,兼容GB2312中的所有字符,所以不是按拼音排序了。在Unicode中,汉字的排列似乎更没有什么规律可言了。

 

为了解决内码顺序与用户习惯顺序(如拼音顺序)的冲突,在glibclocale数据里,要求提供排序方式(collate)的描述。我看了一下glibc-2.3.5提供的locale数据,在简体中文(zh_CN)locale数据描述里,关于排序方式的描述如下:

% ISO 14651 collation sequence

LC_COLLATE

copy "iso14651_t1"

END LC_COLLATE

 

也就是说,照抄iso14651_t1的排序方式。打开iso14651_t1文件看了一下,也没有发现关于中文的特殊处理,可以推断glibc默认的排序方式就是按unicode排序。由此看来,glibc没有提供拼音排序功能,只能由我们自己去实现了。

 

实现拼音排序其实很简单,我在另外一篇文章中介绍了获得汉字对应拼音的方法,我们可以先取出汉字的拼音然后再比较。这种方法会不会性能低下呢?实际上不会,看起来取拼音过程可能会有点慢,但是一次比较函数调用只需要一次取拼音函数调用,因为只当它们的内码不同时才调用取拼音的函数。

 

如果仅仅是为了比较汉字的拼音顺序,其实我们可以用更简单的办法,而不必存储那些拼音数据。我们只要预先把所有汉字按拼音排序,汉字在排序后位置偏移量,就可以用来作为比较的基准值。

 

如何找到所有汉字呢?如果你只需要GB2312中汉字,你可以按我的另外一篇文章里所说的方法去做。如果需要GBK/Unicode中的汉字,GBKUnicode中的汉字是一一对应的,在Unicode中,汉字所在的区间为0x4e00 - 0x9FA5,所以一个循环就可以打印出所有的汉字。

 

如何按拼音排序呢?很简单,有很多工具可以完成这一功能,像wps/word/pagemaker/excelWord排序太慢,而且对行数也有限制,还是用excel吧。

 

数据如何组织?很简单,建立一张unicode与排序偏移量的映射表就行了。考虑到汉字与非汉字之间的比较,我们需要把偏移量加上0x4e00。考虑到空间问题,0x4e00前面都不是汉字,我们的表只要0x9FA5 - 0x4e00 + 1大小就行了,所以表中的unicode要减去0x4e00

 

有兴趣的朋友可以到这里下载。

 

(如果在程序中即要获取拼音,又要按拼音排序,还是建议用取拼音的方式来比较,那样两个功能的数据可以共享。)

 

~~end~~

 

 

发表于 @ 2006年09月25日 22:40:00|评论(loading...)|编辑

新一篇: Linux电源管理研究笔记—动态电源管理(DPM) | 旧一篇: Sqlite中文排序研究

评论

#updatedb 发表于2007-01-17 13:39:11  IP: 221.218.133.*
pinyin.c中有一个bug,当查找不到的时候strcmp会segment fatal:-)
Csdn Blog version 3.1a
Copyright © 李先静