如何处理Unicode排序算法中的字符组合工作?

时间:2014-02-01 04:29:35

标签: unicode uca

我维护了一个名为Unicode Collation Algorithmpyuca的开源纯Python实现。

虽然它满足了我对古希腊文本的排序(并且似乎满足了许多其他人的需求)的需求,但我希望通过将其提升到通过整个套件的范围来提高其对罕见案例的覆盖范围。 official conformance tests

然而,1,869项测试(仅超过1%)失败。第一次失败发生在0332 0334,测试文件建议应该获得排序键| 004A 0021 | 0002 0002 |

然而,

pyuca 形成排序键| 0021 004A | 0002 0002 |

起初我认为这可能是由于缺乏对非首发角色(S2.1.1 thru S2.1.3 of the algorithm in the latest spec)的支持。但是,我后来对这部分的实现并没有改变排序键,而且在纸上通过算法的手册也无法触发那个让我想知道我是否只是缺少某些内容的部分。

算法中的相关步骤是:

S2.1.1 如果S之后有任何非启动器,则处理每个非启动器C.
S2.1.2 如果C未被S阻止,请查找表中是否有S + C匹配。
S2.1.3 如果匹配,请用S + C替换S,然后删除C.

关键词是“如果有匹配”。在上面提到的测试失败时, 0332 0334不匹配,因此算法的这部分不能解释为什么排序键应该是不同的命令我的实现产生。

任何人都可以解释UCA的哪一部分会像测试文件建议的那样构成一个排序键吗?

1 个答案:

答案 0 :(得分:6)

如果你首先将字符串推入规范化表格D,它会更好吗? (第1步。)

基于0332 0334不在NFD中这一事实,这是一个彻头彻尾的猜测。我根本没有试过这个算法。