UCA权重分配

我们一直在审查我们用于UCA的主要重量分配。这是由两个问题引发的:(1)无论如何我们都需要为脚本重新排序做一些工作,(2)权重的分配没有跟上Unicode的增长,导致性能和排序键大小下降。 

背景

我们面临的特殊问题是:

另请参见:

这里有一个粗略的计划。

主要重量

为不应压缩的第一个字节发出数据。也就是说,不是硬编码的主要压缩范围,它们将从合并到分数UCA表中的数据中读取。

为了使脚本重新排序和裁剪协同工作,当在脚本中的第一个字符之前或在脚本中最后一个字符之后裁剪字符时,该字符CE的第一个字节必须仍然在脚本中。 

变量

非变量

按如下方式分配第一个字节:

这主要是为了重新排序脚本,可能需要花费一两个字节。

有关其余脚本(请参见 脚本-重新排序-图表)

*正常的任何字符序列之间都有间隔,以2字节的空间表示。因此,如果我们有<CUC>,那就变成了<Cg U g U g C>(其中C=常见,U=不常见,g=间隙)。当不常见的字符转换为3字节时,我们不需要两字节的间隙。因此,我们将得到<Cg UU C>。U之间以及最后一个U和第一个C之间将有一个3字节的间隙。这假设我们很少在其他字符之前插入字符,因为这样的字符会变成3字节。

隐含和特殊

休息

轨迹范围

特价商品

详细信息(来自Markus)

ICU排序规则使用最后32个前导字节作为固定值:

我们可以很容易地将其压缩到更少的前导字节。例如,从32到8:

以下特殊项目前已定义,但尚未使用,根本不需要编码:CJK_IMPLICIT_TAG、CHARSET_TAG、THAI_TAG。

对于LEAD_SURROGATE_TAG,我们目前需要10位数据,但如果我们改为同时[或更早]使用UTrie2,则不再需要数据。

发电

FractionalUCA(WriteCollationData)的生成器当前具有用于分配的哑算法。也就是说,在一个脚本中给定20个字符,它只是按固定的量增加权重,在末尾留下一个很大的间隙。如果我们愿意,我们可以更改算法以更均匀地分布间隙。可能优先级较低。

测试

我们需要在每个重新排序类型的第一个(script、Nd、IMPLICIT、TRAIL-WEIGHT…)之前和最后一个重新排序类型之后测试字符的剪裁,以确保它们保持在相同的重新排序类型中。