如何判断代码点是否支持字形(例如某些重音)与独立字形相对应

时间:2018-01-14 08:55:24

标签: unicode

熟悉Unicode标准的人是否可以解释如何判断unicode代码点\UAAAABBBB是支持graheme还是独立字形的具体机制?

例如。

  • \U+0045\U+0301一起呈现为É,其字符串长度(1)由字形数字计算。
  • \U+0301单独呈现为́,字符串长度(1)由字形数量计算。

程序如何知道何时忽略字符串长度(和其他函数)中的重音\U+0301并将其作为单个图形单元与\U+0045一起处理 - 何时不??

是否存在某种编码?每个代码点都是硬编码的,具有独立或支持的属性 - 所有支持都只是与最新的独立版本合并?或者还有更具活力的东西?

此行为背后的确切潜在机制是什么?

1 个答案:

答案 0 :(得分:2)

角色属性Grapheme_Cluster_Break对此负责。每个字符属于一个特定类别,这些类别之间的各种交互确定任何给定字符串中的字形边界。通常,属性值为ExtendSpacing_MarkZWJ的字符与其前一个字符组合,但完整的规则集比这更复杂。您可以在section 3 of UAX #29中找到完整的规范。

this data file中提供了所有属性值分配的机器可读版本,您还可以使用this tool获取特定类别中所有字符的列表,例如输入{{ 1}}。

修改:以下是一些示例:

  • U + 0301 COMBINING ACUTE ACCENT的值为[:Grapheme_Cluster_Break=Extend:]。根据规则GB9,具有此值的字符将始终与任何前面的字符(例如字母x)形成组合字形:'x'+''='x',因此x将被计为一个单一单元。几乎所有被描述为组合标记的字符都具有此属性,并且您可以根据需要向集群添加尽可能多的组合标记,因为它们都与之前的标记粘合在一起:x̧̞̥̖̉̄͑̕͘。
  • Hangul脚本使用由两个或三个单独字母组成的音节块编写,每个字母称为jamo。 U + 1100 HANGUL CHOSEONG KIYEOK的值为Extend(代表'领先的jamo')和U + 1161 HANGUL JUNGSEONG A的值为L(代表'vowel jamo')。规则GB6指出一个前导的jamo后面跟一个元音jamo应该组成一个单元,所以序列U + 1100 U + 1161将是一个单一的字形簇:'ᄀ'+'''='가'。< / LI>
  • U + 270A RAISED FIST具有值V(表情符号修饰符基础)和U + 1F3FD EMOJI MODIFIER FITZPATRICK TYPE-4具有值E_Base(表情符号修饰符)。规则GB10声明表情符号修饰符基础后跟表情符号修饰符应被视为一个字形单位:'✊'+''='✊'。

依此类推。这些只是存在的一些规则,我也选择了相对简单的例子来说明问题。正如我所说,完整的规则列表可以在UAX#29中阅读。