StripKey 的实现研究

观察到的现象:

  1. 词头排序与否似乎会影响 Mdict 的查词,参看:
  1. 使用开源打包工具,即使设置了 StripKey = Yes 也不行

猜想: StripKey 对 mdx 文件本身的改动应该不大,但不仅仅是 header 里面 StripKey = Yes 还是 No 这么简单

黑箱测试:
用了一个极其简单的 mdx 源文件,就两个词条:

a
<p>a1</p>
</>
-a
<p>a2</p>
</>

对比 MdxBuilder 勾选和不勾选 StripKey 时的区别,发现 StripKey 确实影响了词头的排序

  • 启用 StripKey 时的排序:a, -a
  • 未启用 StripKey 时的排序:-a, a

同时,用开源工具读取出来的词头是一样的!但是二进制比较发现不一致!按照这里的分析:

对 mdx 文件每一块解压后的二进制进行比较,发现只有 Key Block Info 这一块不同,参看下图红色部分:

完整的图片在上面的链接里面。

作者对这一块内容的解释是,它包括了每个 Key Block 压缩前、后的大小,参看下图蓝色部分:

但远没这么简单!作者的源码里面跳过了两个部分,

也就是 Key Block Info 包含的内容其实依次是:

  • 词头块中的第一个词头
  • 词头块中的最后一个词头
  • 词头块中压缩后的大小
  • 词头块中解压后的大小

比较一下发现,StripKey 改写了词头块中首、尾词头的信息

  • 启用 StripKey 时的首尾词头:a, a
  • 未启用 StripKey 时的首尾词头:-a, a

总结:

  • 启用 StripKey 时,mdx 的 header 中 StripKey = YES
  • 启用 StripKey 时,mdx 的词头块信息中,首、尾词头删去了非字母的部分,例如特殊符号和空格
  • 启用 StripKey 时,词头排序是按照删除了非字母部分进行的
  • StripKey 并不影响 mdx 的主体内容,StripKey 主要功能是词典软件实现的
  • Mdict 依赖词头排序去读取词条,所以不进行词头排序,或者未按照 StripKey 的模式排序,无法得到预期的效果,这就是为什么开源打包工具即使设置了 StripKey = YES 也没用
6 Likes

从词典软件的角度讲,查词的时候,也需要先StripKey后,才能在 MDX 的索引里找到正确的词头。这是双方面的事,如果有一方对 StripKey 的处理不一致,MDX 里自带的索引就无法使用。

1 Like

词典软件还是单独建立词条索引比较好,mdx本身的实现就不是很好

1 Like