我维护了一个名为pyuca的Unicode 排序算法的开源纯 Python 实现。
虽然它满足了我对古希腊文本进行排序的需求(并且似乎满足了许多其他人的需求),但我希望通过使其通过整套官方一致性测试来提高其对罕见情况的覆盖率.
但是,有 1,869 个测试(略高于 1%)失败了。第一个失败是0332 0334
测试文件建议应该获得排序键| 004A 0021 | 0002 0002 |
。
然而pyuca形成了排序键| 0021 004A | 0002 0002 |
。
起初我认为这可能是由于缺乏对非起始字符的支持(最新规范中算法的 S2.1.1 到 S2.1.3)。但是,我随后对这部分的实现并没有改变排序键,并且在纸上手动处理算法也无法触发该部分,这让我想知道我是否只是遗漏了一些东西。
算法中的相关步骤是:
S2.1.1如果 S 后面有 non-starter,则处理每个 non-starter C。
S2.1.2如果 C 没有被 S 阻塞,则查找 S + C 是否在表中匹配。
S2.1.3如果匹配,则将 S 替换为 S + C,并删除 C。
关键短语是“如果有匹配”。在上面提到的失败的测试中,没有匹配0332 0334
项,因此这部分算法无法解释为什么排序键的顺序与我的实现产生的顺序不同。
谁能解释 UCA 的哪一部分会像测试文件所暗示的那样形成排序键?