归一化字符串会产生与归一化单个字素簇相同的结果吗?

时间:2019-07-11 18:36:40

标签: unicode unicode-normalization grapheme-cluster

对字符串执行Unicode归一化的结果(假设没有孤立的组合字符)是否与将字符串分成字素簇,分别对每个簇进行归一化然后将归一化的字素簇进行连接的结果相同? (如果是这样,这仅适用于标准化表格的子集吗?)

主要出于对Unicode如何工作以及找出可能存在的潜在边缘情况的兴趣,而不是将其作为具体应用程序的一部分。

1 个答案:

答案 0 :(得分:4)

不,那通常是不正确的。 Unicode标准对以下假设提出警告:串联规范化字符串会生成另一个规范化字符串。来自UAX #15

  

在使用归一化功能时,重要的是要认识到 none   规范化表单的一部分在字符串连接下关闭。那   是,即使两个字符串X和Y被标准化,它们的字符串   不能保证X + Y并置为

Unicode文本分割算法的许多方面都是可定制的。该标准仅提供了在大多数情况下有用的默认值,但是可以出于特定目的在必要时将其覆盖。因此,不能保证两个符合Unicode的应用程序甚至都无法就字形边界的位置达成一致。一个具体的例子是旧字素簇扩展字素簇之间的区别。

在前者中,具有Grapheme_Cluster_Break属性值Spacing_MarkPrepend的字符不充当字素扩展,而在后者中则起作用。从Unicode 12.1开始,有twelve such characters with a non-zero canonical combining class。如果使用传统字素簇定义,这些字符将破坏您的方法,例如以下顺序:

<U+1D158, U+1D16D, U+1D166>

  • 音乐符号头黑(ccc = 0)
  • 音乐符号组合增强点(ccc = 226)
  • 组合符号的音乐符号(ccc = 216)

由于组合扩充点和组合sprechgesang茎均为Spacing_Mark,因此该序列实际上分为三个传统字素簇,每个簇的长度只有一个字符,因此会自动归一化。但是,由于它们的CCC值,整个字符串的真正归一化将切换点和茎的位置。

如果我们忽略调整算法的可能性,而仅严格按照标准中的定义关注扩展的字素簇,那么分别对每个字素簇进行规范化产生与对整个字符串进行规范化相同的结果就我所知一次,但是没有正式保证该标准的未来修订版不会改变这一点。