有关 unicode 代码点排序的基本原理的信息?

Information on rationale for unicode codepoint sorting?

我正在研究 https://github.com/JuliaLang/utf8proc/blob/master/utf8proc.c#L397,尤其是这个片段:

if (property1->combining_class > property2->combining_class &&
          property2->combining_class > 0) {
        buffer[pos] = uc2;
        buffer[pos+1] = uc1;

显然,有一些 "sorting" 正在进行,但我无法在 Unicode 站点上找到这种排序的基本原理(我只是不知道如何搜索它)。

为什么某些属性先于其他属性,或者只是一个 "canonical" 顺序,是否有一些理由?

这是“规范排序算法”,它为字符后的组合标记定义了单一顺序。问题是在不同位置(例如,字符的上方和下方)具有多个组合标记的字符可以通过多种方式指定:

ṩ: U+0073 U+0323 U+0307

ṩ: U+0073 U+0307 U+0323

规范化文本时,规范排序算法确保 ṩ 只能出现在第一个顺序中:下面的点在上面的点之前。由于字符可以组合的方式多种多样,所以这种特定顺序(在上面之前之前)的原因有点随意,但它遵循 the order in this table——这似乎通常是从下到上,从左到-对。

算法的完整规范在 Unicode 标准的 section 3.11 中给出。