- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
详细词典格式文档 星际译王的词典格式是公开的,这意味着,其它软件可以自由读取星际译王的词典文件。由于StarDict词典文件格式设计简单而清晰合理,所以很多其它软件也在采用这种格式作为他们的词典数据,比如MacOSX下的mdict,手机上的NDS等等。 详细文档包含在了软件源码包里。这是一个500多行的英文文档。因为软件一般都有国际化的要求,而且也会有其他国家的开发人员参与,所以用英文写文档和注释是一个好习惯,也能锻炼自己。 词典文件组成 一个最基本的词典分为.ifo, .idx, .dict三个文件。 还可以有.syn同义语信息文件, .idx.oft索引缓存文件(加快启动速度),.clt单词排序方法文件等,另外也可以有图片资源等目录文件。 .idx文件可以用gzip压缩。 .dict文件可以用dictzip技术压缩,生成.dict.dz文件。 ifo文件内容 Ifo文件包含词典的基本信息。是一个纯文本文件。 idx文件格式 Idx文件格式也很简单。就是一个UTF-8编码的单词,加上\0字符结尾,然后两个32位数字,一个表示解释数据块在.dict文件里的偏移,另一个表示解释数据块的大小。接着就是第二个单词,依次重复。 所有这些单词,按一定的排序规则来存储。比如利用类似strcasecmp的函数。 dict文件格式 dict文件是纯粹的数据块,每个数据块的开始偏移地址和大小记录在idx文件里了。 由于idx文件里已经有了数据长度信息,所以字符串可以不要结尾的\0字符。 数据块的类型由.ifo文件里的sametypesequence标识决定的。可以是纯文本,也可以是html, powerdict, pango, xdxf, xml, 音标,wiki标记等等,正因为如此,StarDict可以兼容各种其他词典的数据类型,只要开发相应的数据解析插件就行了。 查询原理 StarDict通过读取ifo文件,获取了词典的基本信息。然后加载处理.idx单词索引文件,在内存里创建一个元素为32位数字的数组,数组大小就是单词的数量。每个数组成员的值就是对应单词在idx文件里的起始偏移。 比如,第一个单词的偏移肯定就是0,假设第一个单词为apple的话,那么它的单词长度是5,加上结尾的\0占1字节,后面紧跟的解释数据偏移和大小两个32位数字占8字节,总共就是14字节,所以第二个单词在idx文件里的起始偏移肯定就是6+8=14字节,因此数组的第二个元素的值就是14。后面的单词偏移值都以此类推。 由于记录了每个单词在idx文件里的偏移值,这样访问第99个单词时只需读取数组里的第99个数字和第100个数字的值,第99个数字的值就是第99个单词的偏移,第100个数字的值减去第99个数字的值就是第99个单词的大小。这样要访问第任意个单词,都可以非常快,只要相应的fseek和fread就行了。 折半查找 在能迅速访问第任意个序号的单词后,加上单词已经事先排好了序,就可以用折半查找算法来查找对应的词了。 比如查找apple这个词,同时词典里有1000个词,我们先取出第500个词,假设是banana,通过strcasecmp比较,我们肯定a开头的是在b开头的单词的前面,所以我们继续读取第250个单词,再进行比较,又确定是再读取比较第125个单词还是第375个单词。这样范围慢慢缩小,最后找到了apple这个单词的位置,(如果未找到,就可以返回显示未找到了)比如是第85个单词,我们就同时取到idx文件里apple字符串后面的两个数字,有了偏移和大小,再访问.dict文件里的数据块,这样就把解释也读出来了,然后再通过解析,就可以把意思显示到软件界面上来了。 实际中的星际译王是使用的稀疏索引折半查找算法,这样稍微复杂些,但需要的索引数字的数组大小可以只要原来的1/32,这样就达到节省内存的目的。这个数组的内容还可以保存为.idx.oft文件,下次直接mmap加载到内存中,以加快词典加载速度。 代码查看 这段稀疏索引折半查找的代码只有80行,相对于总共的80000行代码,只占千分之一,可见一个软件虽然原理简单,但要做到好用,往往要涉及到其它的各方各面的细节,然后整体架构就会比较复杂了。 这也就是Unix的KISS原则,“Keep it simple, Stupid”的意义所在了。因为复杂只有构建在简单上,才能掌控其复杂性。 dictzip词典压缩技术 对词典的文本解释数据进行压缩是很常见的需要,但一般的压缩方法只能从头到尾进行顺序解压,而词典需要快速访问某一特定偏移和大小的数据,因此dictd软件项目设计了基于gzip的压缩技术,在gzip文件里的附加信息块里保留各个压缩分块的偏移信息,以达到前面的目的。同时解压却可以仍然使用gunzip工具,保持了兼容性,从而很方便。 由
原创力文档


文档评论(0)