试图理解现代Unicode的微妙之处让我头疼。特别是,代码点,字符,字形和字形之间的区别 - 在最简单情况下,使用ASCII字符处理英文文本时,所有这些概念都具有一对一的关系 - 给我带来麻烦。
了解这些术语如何在Matthias Bynens'等文档中使用。 JavaScript has a unicode problem或维基百科在Han unification上发表的文章,我已经认识到这些概念不是一回事,并且将它们混为一谈很危险,但我和我一样。有点难以理解每个词意味着什么。
Unicode Consortium提供glossary来解释这些内容,但它充满了"定义"像这样:
抽象角色 。用于组织,控制或表示文本数据的信息单元。 ...
...
字符 即可。 ...(2)抽象字符的同义词。 (3)Unicode字符编码的基本编码单位。 ...
...
字形 即可。 (1)表示一个或多个字形图像的抽象形式。 (2)字形图像的同义词。在显示Unicode字符数据时,可以选择一个或多个字形来描述特定字符。
...
字形 即可。 (1)在特定书写系统的背景下最低限度的独特写作单位。 ...
这些定义中的大多数具有非常学术和正式的声音质量,但缺乏意味着什么的质量,或者将定义问题推迟到另一个词汇表条目或标准部分。
因此,我寻求那些比我学得更多的人的神秘智慧。这些概念中的每一个究竟是如何彼此不同的,在什么情况下他们之间不会有彼此一对一的关系?
答案 0 :(得分:139)
字符是一个重载的术语,可能意味着许多事情。
代码点是信息的原子单位。 Text 是一系列代码点。每个代码点都是一个由Unicode标准赋予的数字。
代码单元是编码代码点的部分的存储单位。在UTF-8中,这意味着8位,在UTF-16中这意味着16位。单个代码单元可以表示完整的代码点,或代码点的一部分。例如,雪人字形(☃
)是单个代码点,但是3个UTF-8代码单元和1个UTF-16代码单元。
grapheme 是一个或多个代码点的序列,显示为单个图形单元,读者将其识别为书写系统的单个元素。例如,a
和ä
都是字形,但它们可能包含多个代码点(例如ä
可能是两个代码点,其中一个代码点跟随基本字符a
一个用于diaresis;但也有一个替代的,遗留的单个代码点代表这个字形)。某些代码点从不是任何字形的一部分(例如,零宽度非连接或方向覆盖)。
字形是一种图像,通常存储在字体(字形集合)中,用于表示字形或其部分。字体可以将多个字形组合成单个表示,例如,如果上述ä
是单个代码点,则字体可以选择将其呈现为两个单独的,空间上重叠的字形。对于OTF,字体的GSUB和GPOS表包含替换和定位信息以使其工作。字体也可能包含同一个字素的多个替代字形。
答案 1 :(得分:1)
在Unicode标准之外,字符是由一个或多个graphemes组成的单个文本单元。 Unicode标准定义为"字符"实际上是字形和字符的混合。 Unicode提供了将并列字素解释为单个字符的规则。
Unicode code point 是分配给每个 Unicode character 的唯一编号(可以是字符或字素)
不幸的是,Unicode规则允许将一些并置的字素解释为已经拥有自己的代码点的其他字素( precomposed forms )。这意味着Unicode中有多种方式来表示字符。 Unicode normalization解决了这个问题。
字形是角色的直观表示。字体为特定字符集(非Unicode字符)提供一组字形。对于每个角色,都有无数个可能的字形。
对Mark Amery的回复
首先,正如我所说,每个角色都有无数个可能的字形,所以不是,一个字符不是"总是用单个字形表示"。 Unicode并不关心字形,它在代码图中定义的东西肯定不是字形。问题是他们都不是所有角色。那他们是什么?
哪个是更大的实体,字形还是字符?在文本中称那些不是字母或标点符号的图形元素是什么?很快就会想到的一个词是" grapheme"。这个词恰好让人联想到文本中的图形单元"的概念。我提供了这个定义:字素是书面文字中最小的不同组成部分。
一个人可以走另一条路,说那些字母是由人物组成的,但是他们会被称为“中国字素”,并且所有那些由汉字构成的点点滴滴都必须被称为"字符"代替。但是,这一切都倒退了。字形是不同的小点点。人物更发达。短语"字形是可组合的",在Unicode的上下文中会更好地说明"字符是可组合的"。
Unicode定义字符,但它也定义了要与其他字形或字符组合的字素。你组成的那些怪物就是一个很好的例子。如果他们流行起来,他们可能会在更高版本的Unicode中获得自己的代码点;)
这是所有这一切的递归元素。在更高的层次上,字形成为字形变成字形,但它的字形一直在下降。