1 unicode unicode-normalization grapheme-cluster
对字符串执行 Unicode 规范化(假设没有孤立的组合字符)的结果是否与将字符串拆分为字素簇、单独规范化每个簇然后连接规范化的字素簇的结果相同?(如果是这样,这是否仅适用于规范化形式的子集?)
提出这个问题主要是出于对 Unicode 如何工作以及弄清楚可能存在哪些潜在边缘情况的兴趣,而不是作为具体应用程序的一部分。
不,这通常是不正确的。Unicode 标准警告不要假设连接规范化字符串会产生另一个规范化字符串。来自UAX#15:
\n\n\n\n\n在使用规范化函数时,重要的是要认识到在字符串连接下没有任何规范化形式是封闭的。也就是说,即使两个字符串 X 和 Y 被标准化,它们的字符串连接 X+Y 也不能保证被标准化。
\n
Unicode 文本分段算法的许多方面都是可定制的;该标准主要只提供在大多数情况下有用的默认值,但在出于某种目的需要时可以被覆盖。因此,无法保证两个符合 Unicode 的应用程序在字素边界的位置上达成一致。一个具体的例子是遗留字素簇和扩展字素簇之间的区别。
\n\n在前者中,具有Grapheme_Cluster_Break
属性值Spacing_Mark
或 的字符Prepend
不充当字素扩展器,而在后者中则充当字素扩展器。从 Unicode 12.1 开始,有12 个具有非零规范组合类的此类字符。如果您使用旧的字素簇定义,这些字符会破坏您的方法,例如按以下顺序:
<U+1D158, U+1D16D, U+1D166>
这是
\n\n因为组合增强点和组合 sprechgesang 词干都是Spacing_Mark
,所以该序列实际上被分为三个遗留字素簇,每个簇只有一个字符长度,因此会自动标准化。然而,由于 CCC 值的原因,整个字符串的真正标准化会交换点和茎的位置。
如果我们忽略定制算法的可能性,只关注严格按照标准定义的扩展字素簇,那么据我所知,单独规范化每个字素簇应该产生与一次规范化整个字符串相同的结果,但是有并不能正式保证该标准的未来修订版不会改变这一点。
\n 归档时间: |
|
查看次数: |
179 次 |
最近记录: |