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

Mat*_*ens 13 unicode terminology grapheme combining-marks

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

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


Unicode标准,第3章,D52

  • 组合字符:具有组合标记(M)的常规类别的字符.
  • 组合字符由所有字符组成,具有间距组合标记(Mc),非间距标记(Mn)和封闭标记(Me)的常规类别值.
  • 具有非零规范组合类的所有字符都组合字符,但反之则不然:存在组合字符与零规范组合类.
  • 私有字符(Co)作为组合字符或不组合字符的解释由实现决定.
  • 除非正在描述,否则这些字符通常不会单独使用.它们包括重音符号,变音符号,希伯来语点,阿拉伯元音符号和印度语母语等字符.
  • 组合字符的图形定位取决于最后一个基本字符,除非它们由既不是组合字符也不是零宽度连接符或零宽度非连接符的字符分隔.据说组合字符适用于该基本字符.
  • 可能没有这样的基本字符,例如当组合字符位于文本的开头或遵循控件或格式字符时 - 例如,回车符,制表符或左右标记.在这种情况下,组合字符称为隔离组合字符.
  • 对于孤立的组合字符或当进程不能执行图形组合时,进程可以呈现没有图形组合的组合字符; 也就是说,它可能会将其呈现为基本字符.
  • 组合字符的代表性图像在代码表中用虚线圆圈表示.当以与前面的基本字符的图形组合呈现时,该基本字符旨在出现在由虚线圆圈占据的位置中.

Unicode标准,第3章,D59

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

nwe*_*hof 5

实际使用中的区别在于,组合字符被定义为通用类别,用于字符的粗略分类,而字素扩展器主要用于UAX #29 文本分割

编辑:既然你提供了赏金,我可以详细说明一下。

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

Unicode 3.2引入了字素扩展器,用于Unicode 技术报告 #29:文本边界(当时处于提议状态,现在称为Unicode 标准附件 #29:Unicode 文本分段)。主要用途是定义字素。字素簇基本上是用户感知的字符。根据 UAX #29:

字素簇边界对于整理、正则表达式、UI 交互(例如鼠标选择、箭头键移动、退格)、垂直文本分割、首字母样式边界识别以及计算文本中的“字符”位置很重要。

主要区别在于字素扩展器不包括大部分间距标记(该组实际上小于组合字符组)。大多数间距标记是亚洲文字的元音符号。在这些脚本中,元音有时是通过修改辅音字符来书写的。如果这种修改占用了水平空间(间距标记),它曾经被视为一个单独的用户感知字符,并形成一个新的(遗留)字素簇。在 UAX #29 的后续版本中,这一点有所改变,并引入了扩展的字素簇,其中大多数但不是所有的间距标记不会破坏簇。

我认为标准中的关键句子是:“可以将字素扩展器主要视为应用于另一个间距字符上方或下方的那种非间距图形标记。” 另一方面,组合字符还包括应用于left 或 right 的间距标记。不过,也有一些例外(请参阅属性 Other_Grapheme_Extend)。

例子

U+0995 孟加拉字母 KA :

?

U+09C0 孟加拉语元音符号 II(组合字符,但没有字素扩展符):

?

两者的结合:

??

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

像这样不扩展字素的组合字符有 300 多个,不组合但扩展字素的字符有 4 个。