我们一直在审查我们用于UCA的主要重量分配。这是由两个问题引发的:(1)无论如何我们都需要为脚本重新排序做一些工作,(2)权重的分配没有跟上Unicode的增长,导致性能和排序键大小下降。
背景
主要权重的长度可以是1到4个字节。(例如,如果一个字符具有3字节的CE主权重,我们将其称为3字节)
它们有一个限制,即没有权重可以是另一个权重的适当初始序列。例如,如果X的权重为8542,那么没有三个或四个字节的权重可以从8542开始。
重要的是,最常见的字符具有较短的权重。例如,在U5.2中,{space,A-Z}是1字节。
第一个字节很重要,分配给特殊范围:请参阅特殊字节值
如果脚本的第一个字节不同,则可以相互重新排序。然而,我们在第一字节空间中没有足够的空间来为所有脚本执行此操作。
共享同一第一个主字符的所有字符都可以对较短的排序键使用特殊的主压缩。这意味着,如果一个脚本被分割成不同的第一个字节,它就不会从压缩中受益,甚至会变得更长。
当我们生成基表时,我们放置了一些间隙,以允许定制的字符进入。我们尝试在我们预计有更多需求的地方使间隙变大。
我们面临的特殊问题是:
另请参见:
这里有一个粗略的计划。
允许03作为真正的主1字节或第3/4字节
允许FF作为真实的第3/4档
为不应压缩的第一个字节发出数据。也就是说,不是硬编码的主要压缩范围,它们将从合并到分数UCA表中的数据中读取。
为了使脚本重新排序和裁剪协同工作,当在脚本中的第一个字符之前或在脚本中最后一个字符之后裁剪字符时,该字符CE的第一个字节必须仍然在脚本中。
按如下方式分配第一个字节:
这主要是为了重新排序脚本,可能需要花费一两个字节。
有关其余脚本(请参见 脚本-重新排序-图表)
不推荐的脚本
对于推荐的脚本
西里尔文、阿拉伯语、朝鲜文*享受特殊待遇。常用字符为2个字节,不常用字符为3个。
其他推荐的大于1字节的格式为3字节:埃塞俄比亚文、缅甸文、蒙古文、加拿大文、瓦依文、彝文
分数UCA中的测试将在任何其他脚本增长超过第一个字节时发出警报
*正常的任何字符序列之间都有间隔,以2字节的空间表示。因此,如果我们有<CUC>,那就变成了<Cg U g U g C>(其中C=常见,U=不常见,g=间隙)。当不常见的字符转换为3字节时,我们不需要两字节的间隙。因此,我们将得到<Cg UU C>。U之间以及最后一个U和第一个C之间将有一个3字节的间隙。这假设我们很少在其他字符之前插入字符,因为这样的字符会变成3字节。
休息
汉族
非汉族
检查所有非汉族人是否为Cn
破解可能要花费1字节。
轨迹范围
我们从未使用过这个。
缩短一个字节。保存前11个字节。
特价商品
ICU排序规则使用最后32个前导字节作为固定值:
E0..E4隐式(算法构建)汉字和未分配码点的主权重
E5..EF试验重量,未在UCA中使用;这些是为Jamo V和Jamo T量身定制的,但从未使用过这样的订单
F0..FF用于长主CE、扩展、收缩、朝鲜文音节、隐式weight码点等的特殊前导字节。
我们可以很容易地将其压缩到更少的前导字节。例如,从32到8:
以下特殊项目前已定义,但尚未使用,根本不需要编码:CJK_IMPLICIT_TAG、CHARSET_TAG、THAI_TAG。
对于LEAD_SURROGATE_TAG,我们目前需要10位数据,但如果我们改为同时[或更早]使用UTrie2,则不再需要数据。
FractionalUCA(WriteCollationData)的生成器当前具有用于分配的哑算法。也就是说,在一个脚本中给定20个字符,它只是按固定的量增加权重,在末尾留下一个很大的间隙。如果我们愿意,我们可以更改算法以更均匀地分布间隙。可能优先级较低。
我们需要在每个重新排序类型的第一个(script、Nd、IMPLICIT、TRAIL-WEIGHT…)之前和最后一个重新排序类型之后测试字符的剪裁,以确保它们保持在相同的重新排序类型中。