在Unicode中“组合字符”和“字形扩展器”之间有什么区别?

时间:2014-02-12 08:45:09

标签: unicode terminology grapheme combining-marks

Unicode中‘combining characters’‘grapheme extenders’之间的区别是什么?

据我所知,他们似乎做了同样的事情 - 尽管字形扩展器的集合大于组合字符集。我在这里显然遗漏了一些东西。为何区别?


Unicode标准,第3章,D52

  • 组合字符:具有组合标记(M)的常规类别的字符。
  • 组合字符由all characters with the General Category values of Spacing Combining Mark (Mc), Nonspacing Mark (Mn), and Enclosing Mark (Me)组成。
  • 所有具有非零规范组合类的字符都是组合字符,但情况并非如此:组合字符与零规范组合类。
  • 将私人用途字符(Co)解释为组合字符与否,由实现决定。
  • 除非正在描述这些字符,否则通常不会单独使用这些字符。它们包括重音符号,变音符号,希伯来语点,阿拉伯元音符号和印度语matras等字符。
  • 组合字符的图形定位取决于最后一个基本字符,除非它们由既不是组合字符也不是零宽度连接符或零宽度非连接符的字符分隔。据说组合字符适用于该基本字符。
  • 可能没有这样的基本字符,例如当组合字符位于文本的开头或遵循控件或格式字符时(例如,回车符,制表符或左右标记)。在这种情况下,组合字符称为隔离组合字符。
  • 使用隔离的组合字符或当进程无法执行图形组合时,进程可以呈现没有图形组合的组合字符;也就是说,它可能会将其呈现为基本字符。
  • 组合字符的代表性图像在代码表中用虚线圆圈表示。当以与前一个基本字符的图形组合呈现时,该基本字符将出现在由虚线圆圈占据的位置。

Unicode标准,第3章,D59

  • Grapheme extender:具有Grapheme_Extend属性的字符。
  • Grapheme扩展器字符包括所有非间距标记,零宽度连接器,零宽度非连接器,U + FF9E,U + FF9F和少量间距标记。
  • 字形扩展器主要可以设想为在另一个间距字符之上或之下应用的非间距图形标记。 零宽度连接器和零宽度非连接器被正式定义为字形扩展器,因此它们的存在不会破坏一系列其他字形扩展器。
  • 具有Grapheme_Extend属性的少量间距标记是两部分组合标记的第二部分。
  • 根据定义,具有Grapheme_Extend属性的字符集和具有Grapheme_Base属性的字符集是不相交的。

3 个答案:

答案 0 :(得分:3)

实际使用的不同之处在于,组合字符被定义为粗略分类字符的一般类别,而字形扩展器主要用于UAX #29 text segmentation

编辑:由于您提供了赏金,我可以详细说明一下。

组合字符是不能用作独立字符但必须与其他字符组合的字符。它们用于定义组合字符序列

Grapheme扩展程序introduced in Unicode 3.2中使用Unicode Technical Report #29: Text Boundaries(然后处于建议状态,现在称为Unicode Standard Annex #29: Unicode Text Segmentation)。主要用途是定义字形集群。 Grapheme集群基本上是用户感知的字符。根据UAX#29:

  

Grapheme群集边界对于排序规则,正则表达式,UI交互(例如鼠标选择,箭头键移动,退格),垂直文本的分段,首字母样式的边界识别以及计算“字符”位置非常重要文本。

主要区别在于字形扩展器不包括大部分spacing marks(该组实际上小于而不是组合字符集)。大多数间距标记是亚洲文字的元音标记。在这些脚本中,有时通过修改辅音字符来编写元音。如果此修改占用水平空间(间隔标记),则它曾被视为单独的用户感知字符并形成新的(遗留)字形集群。在UAX#29的更高版本中,这已被更改,并且引入了扩展的字形集群,其中大多数但不是所有间距标记都不会破坏集群。

我认为它们来自标准的关键句子是:“字形扩展器可以被认为主要是非间距图形标记的种类上面或下面另一个间距字符。“另一方面,组合字符还包括应用于左或右间距标记。但是有一些例外(参见属性Other_Grapheme_Extend)。

实施例

U + 0995 BENGALI LETTER KA

U + 09C0 BENGALI VOWEL SIGN II (结合角色,但没有grapheme扩展器):

两者结合:

কী

这是由两个遗留字形簇组成的单个组合字符序列。元音符号本身不能使用,但它仍然算作遗留字形簇。例如,文本编辑器可以允许将光标放在两个字符之间。

有超过300个像这样的组合字符,它们不会延伸字形,而有四个字符没有组合但会扩展字形。

答案 1 :(得分:2)

我发布了this question on the Unicode mailing list并得到了更多回复。我会在这里张贴一些。

Tom Gewecke写道:

  

我不是Unicode这方面的专家,但我明白这一点   “字形扩展器”是字符属性中更精细的区别   旨在用于某些特定和复杂的过程,如   字形断裂。您可能会发现此博客文章有助于查看   它发挥作用:   http://useless-factor.blogspot.com/2007/08/unicode-implementers-guide-part-4.html

     

我认为PS The answer by nwellnhof at StackOverflow是对这个问题的一个很好的解释。

Philippe Verdy写道:

  

许多字形扩展器不是“组合字符”。结合   由于遗留原因,这些字符按此方式分类(非常弱   “一般类别”财产)和此财产是规范性的   稳定。同样,大多数组合字符都具有非零值   结合阶级和他们稳定的目的   正常化。

     

Grapheme扩展器包括也没有组合的字符   字符但控件(例如加入者)。一些graphemclusters也是   在某些脚本中更复杂(有扩展器编码之前   基本特征;它们不能归类为组合字符   因为组合字符总是在基数之后编码   字符)

     

由于遗留原因(以及与旧标准的往返兼容性)   并非所有脚本都使用UCS字符模型进行编码   结合人物。 (例如泰国文字;不遵循   “逻辑”编码顺序;但遵循TIS-620中使用的模型   基于它的其他标准;包括Windows和* nix / * nux)。

Richard Wordingham写道:

  

间距组合标记(类别Mc)通常不是字形   扩展。包含的内容大多包括在内   '遗产字形集群'之间的界限   http://www.unicode.org/reports/tr29/tr29-23.html是不变的   规范等价。有六个字形扩展器不是   非规则(Mn)或封闭(Me),此规则不需要:   ZWNJ,ZWJ,U + 302E HANGUL单点音色标记U + 302F HANGUL DOUBLE DOTBLE DOT   TONE MARK U + FF9E HALFWIDTH KATAKANA VOICED SOUND MARK U + FF9F HALFWIDTH   KATAKANA半圆形声音标记

     

我可以看到它有时对ZWNJ和ZWJ有帮助   前一个基本字符。全宽音标U + 3099和   由于规范等价的原因,包括U + 309A,因此它成功   感觉包括他们的半宽版本。

     

我实际上并没有看到包含U + 302E和U + 302F的逻辑。如果   你会鼓励强迫某人输入错误的基础   在3个非间距标记序列之前重新输入该批次的字符,   你也可以使用韩语色调标记。

答案 2 :(得分:1)

我可以引用Yannis Haralambous'Fonts and Encodings,第116页。:

  

这个想法是有时候脚本或符号系统也是如此   细分为人物。当我们削减结构时   进入人物,没有办法再将它们重新组合在一起   重建更大的字符。例如,加泰罗尼亚语有结扎线   '二'。此连字编码为两个Unicode字符:'ŀ'   0x0140 latin small letter l with middle dot和普通的'l'。但   这种分裂可能并不总是我们想要的   假设我们希望   正如我们可能希望的那样,在这个结扎线上放置一个回旋的重音   用连字“œ”和“æ”来做。如何在Unicode中完成?   允许用户在播放rôle的构造中构建字符   对于新字符,Unicode引入了三个新属性(字形   base, grapheme extension ,grapheme link)和一个新角色:   0x034F combining grapheme joiner

所以我看到它的方式,这意味着使用字形扩展器(例如)对由几个字符组成的字符应用(例如)重音。