“字形”和“字符”之间的实际区别是什么?

平面设计 排版 术语
2021-12-31 06:48:53

在 Typography 网站提案上看到了这个问题,我不知道答案让我很烦恼。我一直认为“字形”和“字符”是可以互换的。


看了Unicode Character Encoding Model page 上的解释后,我的理解大致是这样的:

  • 字符由它们在语言中的含义、字形、它们的外观来定义。因此,美学组合的连字fi 是一个字形,但两个字符。

所以,我的信念是(如果我错了,请纠正我)实际的区别是:

  • 对文本美学不感兴趣的文本解析器会将字形读取为它们各自的字符。所以:
    • 如果您要将包含字形的文本复制并粘贴到纯文本编辑器中,则字形将被转换为它们各自的字符( 连字字形将变为fand i
    • 任何制作精良的基于文本解析的自动化系统(例如搜索引擎爬虫、屏幕阅读器、拼写检查器)都会将字形解释为它们各自的字符。
    • 一个字符可以有多个字形或字形集。我想说一个字形只能有一个字符,但这显然是不对的,因为链接文章中有一个示例,其中包含 3 个字形和字形集,它们似乎每个都对应于一个字符和一组字符。我不太明白这是如何工作的:这当然意味着这些字形的解释方式会不一致或模棱两可,因解释器而异?(或者它是否因语言或字体而异?)
    • 虽然字形浏览器(例如 Illustrator 中的浏览器)包含字体的完整字形集,但字符映射(例如 Windows 字符映射)仅包含字符,而不包含像连字这样的多个字符的字形(我以前没有注意到)

我觉得我快到了,但我显然误解了某些地方:不仅仅是“一个字形多个字符”的事情,而且,使用连字的复制和粘贴行为也不我所期望的:

  • 将 Illustrator 中的连字复制到此输入框:fi按预期粘贴为(两个字符)。
  • 粘贴它的 HTML 代码fi( ),以及代码块中的代码(fi),如预期的那样。
  • 将呈现的非代码块连字复制并粘贴回输入框中:粘贴为连字字符,并呈现为连字,无论它是否在代码块中(fi 和)。同样,包含它的单词:fit misfits ( fit misfits) 粘贴为fit misfits ( fit misfits)。也许这取决于它被粘贴的地方是否理解所使用的编码?

我对此的理解有多大的错误?有人能把我说得对吗:明确定义字形和字符之间的区别(如果我的错误或可以改进),并给出比我的更清晰/更准确的例子来说明这在实践中意味着什么?

4个回答

我不认为你的理解是不正确的,你只是看到系统试图通过粘贴它认为他们想要的东西来帮助用户。由于某些连字(“fi”、“fl”)在排版系统之外相当普遍,因此软件会识别出用户可能没有输入该字形,而是另一个应用程序转换了他们键入的字符。

简而言之:字符是指语言单位。字形是指该单位的设计实例,无论是大写、小写、小型大写字母、历史变体还是风格变体。

这里有几个答案可以提供有关字形与字符的良好信息,但它们并没有真正解决您在复制和粘贴方面感到困惑的根源。

首先,你的理解基本正确:

字符由它们在语言中的含义、字形、它们的 外观来定义。因此,美学上结合 fi 的连字是一个字形,但两个字符。

值得强调的是,字符列表是由 Unicode 联盟发布的 Unicode 标准定义的,因为它们是将文本编码为机器可读格式的权威。上面的定义本质上是 Unicode 联盟成员用来确定某些提议的对 Unicode 的添加是否是一个字符,因此值得包含,还是一个字形,应该由字体渲染器处理。

我提到这一点是因为您在上面遇到的困惑是由于 Unicode 中存在多个连字字符(不是字形)。例如,U+FB01是连字的字符:http: //unicode.org/charts/PDF/UFB00.pdf

在 Unicode 中使用连字字符并不真正符合上述定义的精神,即 Unicode 标准中应包含哪些类型的字符作为字符,因为连字实际上并没有独立于其他两个字符组成的含义。Unicode 的人自然知道这一点,连字的 Unicode 常见问题解答也承认:

现有连字的存在基本上是为了与非 Unicode 字符集兼容和往返。不鼓励使用它们。

这个角色的存在最终是你困惑的根源。

在正确实现的软件中,复制文本应始终复制指定的字符,而不是字形,这正是您的三个示例中发生的情况。

1) 在第一个示例中,您在 Illustrator 中键入fi渲染了一个 ligature glyph当您选择并复制该渲染字形时,Illustrator 会正确地将f( U+0066) 和i( U+0069) 字符复制到剪贴板上。

2)在第二个例子中,你输入框中输入字符上面,选择该字形将复制单个字符&#64257U+FB01

3) 在第三个示例中,您正在复制在第 2 部分中呈现的呈现的连字字符 U+FB01,该字符将始终粘贴为该字符。您的主要困惑似乎是关于 HTML 实体代码和字符之间的区别,特别是关于它们如何在代码块内外呈现。

HTML 实体代码&#64257;是一个由 8 个不同字符组成的字符串。Web 浏览器的 HTML 渲染器将这 8 个字符U+0026 U+0023 U+0036 U+0032 U+0035 U+0037 U+0023替换为单个Unicode 字符U+FB01,然后它会适当地渲染。但是,<code>HTML 中的标记禁用了这种行为,将这 8 个字符保持原样。

当您复制呈现的 HTML 时,您会复制呈现的字符(与呈现的字形不同)。因此,当您复制呈现的 HTML 实体时,单个U+FB01字符会复制到剪贴板。

当您将 U+FB01字符粘贴回 HTML 时,不需要进行任何替换,这意味着该字符将呈现为连字,无论它是否位于<code>块内。

字形与文本的呈现方式有关,字符与文本的解释方式有关。当您复制和粘贴时,源应用程序通常会提供多种格式的选择。纯文本会将 fi 连字分解为 f 和 i,HTML 格式可以将其转换为您引用的 char 实体,也可以将其分解为 f 和 i。

一般来说,字符和字形之间的关系是 n:m。在印度语言中,一些字符分为两个字形,放置在单词的不同位置。在拉丁语中,最接近这种情况的是将 é 渲染为两个字形(e 和 ´)。在阿拉伯语中,每个字符都有不同的字形,具体取决于它在单词中的位置:初始、中间、最终或孤立。

从字符到字形的翻译特定于每个应用程序及其支持的印刷功能。对于拉丁文本,这种翻译过去很简单,但 OpenType 字体引入了附加功能,如连字、花体字、替代形式、小型大写字母等。

出于实际原因,当您实现应用程序如何呈现文本时,或者当您设计字体时,或者当您想要应用 OpenType 功能将某些字形替换为其他字形(例如连字)时,您只关心字形。否则,Unicode 代码点是您的朋友。

字符是存储在文本文件中、由应用程序处理和移动的内容,而字形是它们的视觉表示。

为了有一个清晰的画面,让我们看看当应用程序尝试在屏幕上呈现一串文本时会发生什么(以一种有点简化的方式):

  • 应用程序首先读取文本字符串,即它存储在磁盘或内存中的字符串。
  • 然后它将它发送到文本布局引擎,以及所需的字体、文本语言等一些其他属性:
    • 文本布局引擎基本上会打开字体文件,向它询问与每个字符对应的字形,并进行一些字形替换(例如将字形替换为fi的连字字形fi)和定位(例如字距调整)。
    • 最后,布局引擎有一个字形序列,它们之间的相对位置,以及输入字符和输出字形之间的映射。字符到字形的映射是为了让它知道单词中的前两个字符file对应两个第一个字形(fi连字),第三个字符对应第二个字形,第四个字符对应第三个字形。
  • 然后使用图形渲染库使用字体中的形状在屏幕上“绘制”这些字形。
  • 当用户在屏幕上选择“字形”时,应用程序将查询布局引擎提供的字形到文本的映射,以查找输入文本的哪一部分与用户正在选择的内容相对应,并将该文本发送到剪贴板。用户复制它。
  • 当用户将光标插入文本中间并开始输入时,也会发生同样的情况,映射确定在输入文本中插入新字符的位置,以及将更新文本发送到布局引擎进行处理和重绘等等。