一个字符、一个码位、一个字形和一个字素之间的区别是什么?

试图理解现代Unicode的微妙之处让我头疼。特别是,代码点、字符、符号和字母素之间的区别——在简单的情况下,当使用ASCII字符处理英语文本时,这些概念彼此之间都有一对一的关系——给我带来了麻烦。

看到这些术语是如何在Matthias Bynens的JavaScript有unicode问题或维基百科关于韩统一的文章中使用的,我已经收集到这些概念不是同一件事,合并它们是危险的,但我有点努力掌握每个术语意味着

Unicode联盟提供了术语表来解释这些东西,但它充满了像这样的“定义”:

< em >抽象字符< / em >。用于组织、控制或表示文本数据的信息单位. ...

...

< em >字符< / em >……(2)抽象字符的同义词。(3)编码的基本单位为Unicode字符编码. ...

...

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

...

< em >字母< / em >。(1)在特定书写系统. ...的上下文中具有最低限度独特的书写单元

这些定义大多具有听起来非常学术和正式的性质,但缺乏意味着什么的性质,否则将定义问题推迟到标准的另一个术语表条目或部分。

因此,我向那些比我更有学问的人寻求神秘的智慧,这些概念之间究竟有什么不同?在什么情况下,它们彼此之间不会有一对一的关系?

47182 次浏览
  • 字符是一个重载的术语,可以有很多含义。

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

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

  • 字母是一个或多个代码点的序列,显示为单个图形单元,读者可以将其识别为书写系统的单个元素。例如,aä都是字母素,但它们可以由多个码位组成(例如,ä可以是两个码位,一个是基本字符a,另一个是变分字符;但还有一种替代方法,即遗留的单码点表示这个字素)。有些代码点从来不是任何字素的一部分(例如,零宽度非拼接者,或方向覆盖)。

  • 字形是一个图像,通常存储在字体(这是一个字形的集合)中,用于表示字母或其部分。字体可以将多个符号组合成一个表示形式,例如,如果上面的ä是一个代码点,字体可以选择将其呈现为两个独立的空间重叠的符号。对于OTF,字体的GSUB和GPOS表包含替换和定位信息。对于同一个字素,字体也可以包含多个替代字形。

在Unicode标准之外,字符是由一个或多个字母组成的单个文本单元。Unicode标准定义的“字符”实际上是字母和字符的混合体。Unicode提供了将并列的字素解释为单个字符的规则。

Unicode 码点是分配给每个Unicode字符的唯一数字(它可以是一个字符或一个字素)。

不幸的是,Unicode规则允许一些并列的字素被解释为其他已经有自己的码位的字素(预组合表单)。这意味着在Unicode中有不止一种表示字符的方法。Unicode正常化解决了这个问题。

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

回复Mark Amery

首先,正如我所说的,每个字符都有无限个可能的字形,所以不,一个字符并不“总是由一个单一的字形表示”。Unicode本身并不太关心字形,而且它在代码图表中定义的东西当然也不是字形。问题是他们都不是角色。那么它们是什么呢?

哪个是更大的实体,字素还是字符?文字中那些不是字母或标点符号的图形元素叫什么?一个很快出现在脑海中的术语是“字素”。这个词准确地让人联想到“文本中的图形单位”的概念。我提供了这个定义:字素是书面文本中最小的独立成分

我们也可以反过来说,字素是由汉字组成的,但这样它们就被称为“汉字字素”,而由汉字字素组成的那些碎片就只能被称为“汉字”了。然而,这一切都是相反的。字素是不同的小碎片。角色更加成熟。“符号是可组合的”这个短语在Unicode上下文中应该更好地表述为“字符是可组合的”。

Unicode定义了字符,但它也定义了与其他字素或字符组成的字素。你创作的那些怪物就是一个很好的例子。如果它们流行起来,也许它们会在Unicode的后续版本中获得自己的代码点;)

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

回复T S

第一章的 标准声明:“Unicode字符编码处理字母字符, 表意文字,相当于符号,这意味着它们可以被使用 在任何混合物中,以同样的方式"根据这句话,我们应该是 为标准中一些术语的合并做好准备。有时适当的 只有在标准发展的过程中,回顾起来,术语才会变得清晰 在一种语言的正式定义中,经常出现两个基本的问题 事物是根据彼此来定义的。例如,在 XML一个元素被定义为开始标记 可能后面跟着内容,后面跟着结束标记。内容定义在 Turn可以作为元素、字符数据或其他一些可能的东西。一个 自引用定义的模式也隐含在Unicode中 标准:< / p >

字素是一个码位或字符。

字符由一个或多个字母序列组成。

第一次面对这两个定义时,读者可能会反对 第一个定义基于一个代码点一个字符,但是 这并不总是正确的。由两个编码点组成的序列有时编码A 下单码点 归一化,和那个 编码的码位表示字符,如 图2.7。序列 编码其他代码点的代码点。这有点棘手 我们甚至还没有达到字符编码方案的层次 如utf - 8所使用的

在某些情况下,例如一篇关于 变音符号,和individual 一个字符的一部分可能会自己出现在文本中。在这种情况下, 单个字符部分可以被认为是一个字符,所以这是有意义的 统一码标准也保持灵活。< / p > 正如Mark Avery所指出的,一个角色可以被组合成一个更复杂的角色 事情也就是说,如果需要,每个字符都可以作为一个字素。的 所有组合的最终结果都是“用户认为是一个”的东西 性格”。似乎也没有任何真正的阻力 标准或在此讨论中,以观念的最高境界有之 文本中的这些东西,用户认为是单独的字符。来 为了避免这个词被重载,我们可以在任何情况下使用“grapheme”

.表示组成字符的部分 有时候,Unicode标准的术语到处都是。为 例如,第三章 将UTF-8定义为“编码形式”,而术语表定义为“编码” 而UTF-8则是“字符编码方案”。另一个 例如"Grapheme_Base"和"Grapheme_Extend", 是 已确认为 错误却一直存在,因为清除它们是一项艰巨的任务。有

.

.

.

关于增加combine GRAPHEME的建议 JOINER得到它 “字素是一个或多个编码的序列 与用户认为的字符相对应的字符。”它应该 而是读成:“一个或多个字母序列组成了用户 就像一个角色。”那么它可以使用"字素序列"这个术语 明显来自术语“字符序列”。这两个术语都很有用。 “字素序列”巧妙地暗示了一个汉字的形成过程 小的碎片。“字符序列”指的是我们通常凭直觉感知到的东西 意思是:“用户认为是字符的一系列事物。”< / p > 有时候程序员确实想在字素的层面上进行操作 序列,所以检查和操作这些序列的机制应该是 可用,但通常在处理文本时,对其进行操作就足够了 “字符序列”(用户认为的字符),并让

.系统管理底层细节

在本文讨论到目前为止的所有情况下,使用“grapheme”更清晰。 指不可分割的组成部分,“字符”指组成部分 实体。这种用法也更好地反映了两者长期以来的含义 术语。< / p >