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

Jam*_*ber 4 unicode uca

我维护了一个名为pyucaUnicode整理算法的开源纯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之后有任何非启动器,则处理每个非启动器C.
S2.1.2如果C未被S阻止,则查找S + C是否在表中匹配.
S2.1.3如果匹配,用S + C替换S,并删除C.

关键短语是"如果有匹配".在上面提到的失败试验,也就是敌不过0332 0334等算法的这部分无法解释为什么排序关键字应以不同的顺序是什么我的实现产生.

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

And*_*kin 6

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

根据0332 0334不在NFD中的事实,这是一个完全疯狂的猜测.我根本没有尝试过这个算法.