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

Unicode排序算法中组合字符的处理是如何工作的?,unicode,uca,Unicode,Uca,我维护了一个开源的纯Python实现,名为 虽然它满足了我对古希腊文本分类的需要(似乎也满足了许多其他人的需要),但我希望通过让它通过整套文本来提高它对罕见案例的覆盖率 然而,1869项测试(略高于1%)失败。第一个故障位于0332 0334,测试文件建议该故障应获得排序键|004A 0021 | 0002 0002 | 但是,pyuca构成排序键|0021 004A | 0002 0002 | 起初我认为这可能是由于缺乏对非起始字符()的支持。然而,我对这一部分的后续实现并没有改变排序键,并且

我维护了一个开源的纯Python实现,名为

虽然它满足了我对古希腊文本分类的需要(似乎也满足了许多其他人的需要),但我希望通过让它通过整套文本来提高它对罕见案例的覆盖率

然而,1869项测试(略高于1%)失败。第一个故障位于
0332 0334
,测试文件建议该故障应获得排序键
|004A 0021 | 0002 0002 |

但是,pyuca构成排序键
|0021 004A | 0002 0002 |

起初我认为这可能是由于缺乏对非起始字符()的支持。然而,我对这一部分的后续实现并没有改变排序键,并且在纸上手动处理算法也未能触发该部分,这让我怀疑我是否遗漏了什么

算法中的相关步骤包括:

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

关键短语是“如果有匹配”。在上述失败的测试中,没有与
0332 0334
匹配的项,因此算法的这一部分无法解释为什么排序键的顺序应该与我的实现产生的顺序不同


有人能解释一下UCA的哪个部分会像测试文件所建议的那样形成排序键吗?

如果先将字符串放入规范化表单D中,效果会更好吗?(步骤1。)


这完全是胡乱猜测,因为
0332 0334
不在NFD中。我根本没有尝试过这个算法。

我一定会尝试的。在正常使用中,我总是通过NFD,但是(可能是愚蠢的)我不认为这样做是运行符合性测试的一部分。从1869次下降到85次。通常情况下,答案比我想象的要简单得多,我走错了方向。非常感谢!仅供参考,这里有一些参考代码(Java)和一个在线小程序演示,如果您还不知道的话,您可能会发现它有助于跟踪这些测试用例的其余部分:对于稍后遇到的任何人,pyuca现在通过了100%的一致性测试套件。