字符,代码点,字形和字形之间有什么区别?


146

试图理解现代Unicode的微妙之处使我很头疼。特别是,代码点,字符,字形和字形之间的区别-在最简单的情况下,使用ASCII字符处理英文文本时,它们之间都是一对一的关系,这些概念给我带来了麻烦。

看到这些术语如何在诸如Matthias Bynens的JavaScript之类的文档中使用unicode问题或Wikipedia关于汉统一的文章时,我收集到这些概念不是一回事,将它们混淆是很危险的,但是我有点努力掌握每个术语的含义

Unicode联合会提供了一个词汇表来解释这些内容,但是它充满了这样的“定义”:

抽象人物。信息单位,用于组织,控制或表示文本数据。...

...

性格。...(2)抽象字符的同义词。(3)Unicode字符编码的基本编码单位。...

...

字形。(1)代表一个或多个字形图像的抽象形式。(2)字形图像的同义词。在显示Unicode字符数据时,可以选择一个或多个字形来描绘特定字符。

...

字素。(1)在特定书写系统的情况下,最小区别的书写单位。...

这些定义中的大多数具有听起来很学术和形式化的质量,但是缺乏任何含义的质量,否则将定义问题推迟到标准的另一个词汇表条目或部分。

因此,我寻求那些比我更博学的人的奥秘智慧。这些概念中的每一个究竟有何不同?在什么情况下它们之间不会存在一对一的关系?


对于许多不同的语言,有许多非常不同的书写系统。因此,在写作问题上存在着不同的看法,并且在其背后也有着悠久的历史。恕我直言,记住这一点很有用,因为Unicode试图覆盖所有内容。(草书相同或不同的字符汉字自由基韩文读音符号肤色的表情符号?? ...????)
巴勃罗^ h

Answers:


225
  • 字符是一个重载的术语,其含义不胜枚举。

  • 码点是信息的原子单位。文本是代码点的序列。每个代码点都是一个数字,该数字由Unicode标准赋予含义。

  • 代码单元是一个存储的单元部分的编码码点。在UTF-8中,这意味着8位,在UTF-16中,这意味着16位。单个代码单元可以代表完整的代码点或部分代码点。例如,雪人字形()是单个代码点,但是3个UTF-8代码单元和1个UTF-16代码单元。

  • 字形是被显示为一个阅读器识别为书写系统的一个单一的元素的单一的图形单元中的一个或多个码点的序列。例如,a和和ä都是字素,但它们可能由多个代码点组成(例如,ä可能是两个代码点,一个是基字符,a然后是一个diaresis;但是还有一个替代的,遗留的,单个代码点表示这个字素)。某些代码点从不属于任何字素(例如,零宽度非连接符或方向替代)。

  • 字形是一个图像,通常是存储在字体(这是字形的集合),用于表示字形或其部分。字体可以将多个字形组合成一个单一的表示形式,例如,如果上述内容ä是单个代码点,则字体可以选择将其呈现为两个单独的空间重叠字形。对于OTF,字体的GSUB和GPOS表包含替换和位置信息以使其起作用。字体也可能包含同一字形的多个替代字形。


4
我刚刚提交了一份修改,重新排列了代码点和代码单元的顺序。我同意您的观点,即代码单元应该排在第二位。至于“不合时宜”,我怀疑您认为这个答案与我的目的不同。我认为将所有这五个词放在一个地方具有很大的价值。我要说的最后一件事是在Google上搜索“字形,字形,代码单元和代码点之间的区别,并且必须在两个地方得到答案。在很多讨论中,这些术语都在讨论中使用,很少这样做我看到了与其他四个的讨论,但没有代码单元的讨论
Micah Zoltu

1
因此,例如“ \ uD83D \ uDC0A”(显示鳄鱼表情符号)的代码点,字素等是什么?特别是,它是如何涉及到.length.codePointAt(0).codePointAt(1).charCodeAt(0).charCodeAt(1)结果?
qbolec

3
@qbolec:这是两个表示单个代码点(U + 1F40A)的UTF-16代码单元,并且由于它是一个表情符号,因此大概是它自己的单个字素。
Kerrek SB

2
@TomPažourek:在分解的规范化中,它由两个代码点表示(a加上“组合变音符号”);在组合规范化中,它由单个代码点表示(ä来自旧的传统Latin-1范围)。Unicode规范化是您要研究的主题,如果您对此感兴趣。在一片空白的世界中,将只有基础角色和组合角色,而没有预建的合成。
Kerrek SB

1
@Kaushik:我不确定您的意思:一个代码单位是存储单位,是的,但是一个代码点通常需要多个代码单位来存储(UTF-32中除外)。
Kerrek SB

1

Unicode标准外的字符是一个文本的个别单元的一种或多种组成的字形。Unicode标准定义为“字符”的内容实际上是字素和字符的混合。Unicode提供了将并列的字素解释为单个字符的规则。

Unicode的 码点是分配给每个唯一的编号Unicode字符(其可以是一个字符或字形)。

不幸的是,Unicode规则允许将某些并置的字素解释为已经具有自己的代码点(预组合形式)的其他字素。这意味着Unicode中有多种方式来表示字符。Unicode规范化解决了这个问题。

字形是角色的视觉表示。字体为一组特定的字符(不是Unicode字符)提供一组字形。对于每个字符,都有无限多个可能的字形。

回复马克·阿默里

首先,正如我所说,每个字符都有无限多个可能的字形,因此不,一个字符不是“总是由单个字形表示”。Unicode对字形的关注并不多,它在代码表中定义的内容当然也不是字形。问题在于它们都不都是字符。那是什么

哪个更大的实体,字素或字符?人们怎么称呼那些不是字母或标点符号的图形元素?浮现在脑海中的一个名词是“字素”。这个词恰恰构想出“文本中的图形单元”的概念。我提供以下定义:字素是书面文本中最小的不同组成部分

有人可能会说另一种说法,即字素是由字符组成的,但后来它们被称为“中国字素”,而所有由中国字素组成的点点滴滴都必须被称为“字符”。但是,这全都是倒退。字素是不同的小片段。人物比较发达。短语“字形是可组合的”在Unicode的上下文中会更好地表述为“字符可组合”。

Unicode定义了字符,但它也定义了要与其他字素或字符组成的字素。您组成的那些怪兽就是一个很好的例子。如果他们赶上了,也许他们会在更高版本的Unicode中获得自己的代码点;)

所有这些都有一个递归元素。在更高的层次上,字素变成了字符,变成了字素,但是它一直都是字素。

对TS的回复

该标准的第一章指出:“ Unicode字符编码等效地对待字母,表意字符和符号,这意味着它们可以以任何混合物使用并且具有相同的功能”。鉴于此陈述,我们应该为标准中的术语混用做好准备。有时,随着标准的发展,适当的术语只会在回顾中变得清晰。

通常在一种语言的正式定义中,两个基本事物是相互定义的。例如,在 XML中,一个元素被定义为一个开始标签,可能后面跟着内容,然后是结束标签。内容又定义为元素,字符数据或其他一些可能的东西。自我引用定义的模式也隐含在Unicode标准中:

字素是代码点或字符。

一个字符是由一个或多个字素的序列组成的。

当第一次遇到这两个定义时,读者可能会以代码点字符为由而反对第一个定义,但这并不总是正确的。如图2.7所示,两个代码点的序列有时会在归一化的情况下对单个代码点进行 编码,并且该编码的代码点表示字符 。编码其他代码点的代码点序列。这变得有些棘手,我们甚至还没有到达使用字符编码方案(例如UTF-8)将代码点编码为字节序列的层次。

在某些情况下,例如有关变音符号的学术文章 和人物的各个部分可能会单独出现在文本中。在这种情况下,可以将单个字符部分视为一个字符,因此Unicode标准也应保持灵活性。

正如马克·艾弗里(Mark Avery)所指出的那样,角色可以组成更复杂的事物。也就是说,如果需要,每个字符都可以用作字素。所有构图的最终结果都是“用户认为是角色”。无论是在标准中还是在本讨论中,似乎都没有任何真正的阻力可以阻止用户在最高层次上将文本视为用户的单个字符。为避免重载该术语,在所有要引用组成字符的部分的情况下,我们都可以使用“字素”。

有时,Unicode标准及其术语无处不在。例如,第3章 将UTF-8定义为“编码形式”,而词汇表将“编码形式”定义为其他形式,将UTF-8定义为“字符编码方案”。另一个示例是“ Grapheme_Base”和“ Grapheme_Extend”,它们被认为是错误,但由于清除它们是一项繁重的工作,因此仍然存在。仍有工作要做以加强该标准所采用的术语。

关于添加“ GRAPHHEME JOINER组合 ”的提案错误地指出,“字素是一个或多个编码字符的序列,与用户认为的字符相对应”。它应改为:“一个或多个字素的序列构成了用户认为是字符的内容。” 然后,它可以与术语“字符序列”不同地使用术语“字素序列”。这两个术语都是有用的。“字素序列”巧妙地暗示了从较小的片段中构建角色的过程。“字符序列”是指我们通常都直指的含义:“一系列用户认为是字符的事物。”

有时程序员确实确实希望在字素序列的级别上进行操作,因此应该可以使用检查和操纵这些序列的机制,但是通常,在处理文本时,对“字符序列”进行操作就足够了(用户认为作为字符),然后让系统管理较低级别的详细信息。

到目前为止,在本讨论中讨论的所有情况下,使用“字素”来指代不可分割的组件,而使用“字符”来指代组成的实体则更为简洁。此用法还更好地反映了两个术语的长期含义。


谨慎的-1;我认为这是错误的。您暗示一个字符可以由许多字素组成,但始终将由一个字形表示。我认为实际上是另一回事。诸如en.wikipedia.org/wiki/N-diaeresis之类的页面表明,字母与变音符号(至少一个改变其含义的字母)的组合形成了独特的新字素,​​而变音符本身并不是一个字素。同时,字形显然是可组合的。s
Mark Amery

我很欣赏我刚刚看到的答复。但是,我仍然认为您对字素的定义实际上是错误的,或者至少与Unicode定义单词的方式不一致。您不认为将字素由字符组成的想法是“全部向后”,但我做了一些挖掘,发现unicode.org/L2/L2000/00274-N2236-grapheme-joiner.htm的字面意思是“字素是一个或多个编码字符的序列
马克·阿默里

然后,该语句继续:“ ...与用户认为的字符相对应。” 甚至术语“ grapheme-joiner ”以及其背后的机制也说明了我在回答之初所说的内容:Unicode标准定义为“字符”的内容实际上是字素和字符的混合体。将字素称为“ graphemes”,将字符称为“ character”是比较干净的,而不是发明诸如“ 预组合字符 ”和“ grapheme簇 ”之类的扭曲。
可怜的约里克·

@PoorYorick您声称,“ ...一个字符是由一个或多个字素组成的单个文本单元”,并且“字素是不同的点点滴滴。字符更加发达”。您有支持这些主张的参考吗?因为我有点怀疑,Unicode联盟故意决定以某种方式“反转”定义其名称。
TS TS

@PoorYorick我理解您的观点,在您添加此进一步说明之前,这不是我问的原因。我只是索要参考资料(词典,科学文章,技术标准等),因为我不知道任何文档,该文档使用字形解释您的方式。(谷歌搜索字形的前几个Google搜索结果也不会以您的方式使用)。您添加了一个块引用“一个字素是一个代码点或一个字符。[...]”-但它是从哪里来的?最后,您说“这两个术语的既定含义”。-如果已建立,则链接到某物,即以这种方式使用该术语。
TS
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.