Unicode中‘combining characters’和‘grapheme extenders’之间的区别是什么?
据我所知,他们似乎做了同样的事情 - 尽管字形扩展器的集合大于组合字符集。我在这里显然遗漏了一些东西。为何区别?
答案 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
。
所以我看到它的方式,这意味着使用字形扩展器(例如)对由几个字符组成的字符应用(例如)重音。