Unicode 编码

  • by Rainer Erich Scheichelbauer
  • Tutorial

如果你想要确保你的字体工作正常,一些字符形需要合适的 Unicode 编码。本文将介绍作为设计师你所需要了解的内容。

“字符”和“字符形”

字体设计师创造新的字符形,即代表字符的图形。字体设计师通常不创造新的字符,即这些图形的含义,或者更专业地讲,“书面语言中具备语义价值的最小成分”。我们不发明字母表,我们只将现有的字母表重新演绎。(好吧,有时候我们确实也会发明新的字母表,但那就是另一个故事了。保持冷静,继续读吧。)

简而言之:“字符”是你键入的内容,“字符形”是你看到的内容。

一个字符形通常对应一个字符,无论是字母、数字还是标点符号。字符具有 Unicode 编码。字符形和字符的关系,由字符形所关联的 Unicode 值所表示。在 Glyphs 中,Unicode 值以多种方式显示。比如,在字体视图中,你会在字符形名称的右侧看到它:

一个字符形也可以同时代表几个字符。以 f_f_f 合字为例,它代表排成一行的三个 f。合字没有 Unicode 编码,因为其中每个独立的字符已经有了编码,而合字并没有改变每部分的含义。(实际上,有些合字确实拥有历史遗留的代码,但仅仅是为了向后兼容那些过时的编码,它们来自很久很久以前 8 位机的黑暗时代。比如,f_f 拥有 U+FB00 LATIN SMALL LIGATURE FF 这个 Unicode码位。如果你不能理解“8 位机”是什么意思,那么请立即从你的记忆中抹掉括号中的内容,保持冷静,继续读吧。)

有时,一个字符形仅用作其他字符形的一部分。比如,你可以为衬线使用单独的字符形。所以一言以蔽之,字符形是一个图形——一个或几个字符的图形,或者其他字符形的一部分。而字体设计师则绘制这样的图形。

Unicode、平面和区块

几个世纪以来,字母表变得越来越复杂,不再只是普通的 a 到 z。首先,我们有各种变音符号,特殊字母,以及(几乎)所有的大小写形式。其次,还有着很多很多很多拉丁字母之外的文字形式。再加上成百上千的符号、数字、标点符号等等等等。

所以长话短说,我们需要用一种方法来记录一切。差不多是一张巨大的表,用于记录所有文字系统中的所有字符,基本上是你所可能想要在任何地方输入文字所需的内容。嗯,这就是所谓的 Unicode

Unicode 就是一张表,记录了编码和符号的映射关系,还有一堆元数据。表示单个代码有不同的方式(被称作“Unicode 转换格式”或 UTF),而 Glyphs 使用 16 进制的 UTF-16 协议。如果你不知道的话,十六进制使用 16 个数字(而不是通常的 10 个)来计数。我们使用 A 到 F 的字母用于多出来的数字,因此这样数:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F、10、11、12、13、14、15、16、17、18、19、1A、1B,等等。你肯定能懂的。

Unicode 拥有 17 个平面,每个平面上有 65,536 个字符,最重要的字符位于“基本多文种平面”(BMP,或称“第零平面” Plane 0),从 U+0000U+FFFF;以及增补多文种平面(SMP,或称“第一平面”),从 U+10000U+1FFFF。平面被分为多个字符区块,通常包含一种文字,例如泰米尔文从 U+0B80U+0BFF,或是某种有趣的东西,比如表情符号(从 U+1F600 开始)。

目前而言,并非全部的(17×65,536=)1,114,112 个码位都在使用。截至本文撰写时,最新的 Unicode 标准为2018 年六月的版本 11.0.0,其中有 137,374 个字符。一部分 Unicode 则被故意留作私用。Unicode 中共有三个这样的私用区域(PUA),其中最重要的一个是从 U+E000U+F8FF

对于那些非官方的、不可能被正式加入 Unicode 的文字,像是克林贡语,极客们就在私用区里搞出了一个人造语言 Unicode 登记处

Unicode 和 Glyphs

在 Glyphs 中,你通常无需担心 Unicode,因为 Glyphs 会通过字符形名称来确定正确的编码(或不含编码)。打开“窗口 > 字符形信息”(Cmd-Opt-I),通过在搜索框中输入名称(或名称的一部分) 来查找特定的字符形:

Glyphs 内置一个预定义字符形名称的数据库。如果你非常想,也可以添加自己的定义。“字符形信息”窗口显示名称、Unicode 编码(如果有)每个字符形的元数据。从 Glyphs 1.3.18 开始,你可以通过选中字符形并点击右下角的“添加至字体”按钮,将其快速添加到字体中。

如果你改变“字符形信息”窗口的大小,你甚至可以很方便地看到每个字符形的部件组成信息:

例如,如果你想要向字体中添加 adieresismacron ǟ,确保你的字体中已经有了 adieresis 以及 macron。然后 Glyphs 就可以使用这些字符形作为 adieresismacron 的部件,立刻构建出整个 ǟ。非常酷。

如果你想添加的字符形在“字符形信息”窗口中没有列出,你可以使用 uniXXXX 格式将其关联到“基本多文种平面”中的某个字符上。XXXXUTF-16 的四位十六进制编码。对于更高的平面,请使用 uXXXXX,即以 u 开头而非 uni。然后 Glyphs 会自动添加合适的 Unicode 编码。

请记住,并非所有字符形都需要 Unicode。特别是如果一个字符形是通过 OpenType 特性调出的,那就不需要编码它。只有当你想直接通过键盘输入某个字符形时,它才需要一个编码。例如,你不需要编码某个字母的小型大写体或风格变体,因为用户会键入正常的大小写字母,然后在所使用的软件中打开相应的功能。

同一字形的多个 Unicode 值

如果你想要让两个 Unicode 码位共享同一个字符形状,该怎么办?当你需要这样做的时候,有几种解决方式。例如,“增量”符号(increment,∆)U+2206 和希腊字母 Delta U+0394 的造型是一样的。“欧姆”(Ohm,Ω)U+2126 和 Omega U+03A9 也是如此。或者,你在创建一款全大写字体。再或者,你只是想让“空格”U+0020 和“不断行空格”(non-breaking space)U+00A0 共用同一个空格字符形。

你有两个选择:“双重映射”和“双字符形”。

  1. 双重映射: 为同一个字符形指定多个 Unicode 值。只要点击 Unicode 输入框,键入第二个 Unicode 值即可。例如,在空格中 0020 旁边添加 00A0,并按回车键:

    这种方式的优点是保持文件体积较小。所以对于需要尽可能小的网页字体而言是一个好方法。缺点则是,从使用双编码字体的 PDF 中复制文本时会出现问题。(想了解更多,请阅读全大写教程中“双编码的问题”一节。)不过我们还是推荐这种方法,因为从 PDF 中复制出来的文本会出现各种方面的状况,无论如何都没有什么希望,因此也不值得为这一问题流泪。
     

  2. 双字符形:你可以使用简单的规则为一个字符形创建部件副本。“部件副本”字符形中,只有一个作为部件插入的原字符形。如果部件开启了自动对齐,那么原件和副本会永远保持同步。使用字符形配方创建部件副本很简单,选择“字符 > 添加字符形…”(Cmd-Shift-G),键入原字符形名称,后接等号,再接副本字符形名称。

    例:你已经有了希腊字母 Delta,但还想在将其用作增量符号(并且你很在意上文提到的 PDF 文本复制问题)。按下 Cmd-Shift-G 打开“添加字符形…”对话框,键入 Delta=increment 并按下“生成”:

    如果你想要让空格字符形彼此相同,这当然不需要部件。简单地使用字宽的“联动量度”更为巧妙。例如,如果你想让不断行空格和常规空格一样,打开 nbspace 字符形进入编辑状态,在“宽度”文本框中输入 =space。然后选择“字符 > 更新量度”(Ctrl-Cmd-M)确保量度保持同步。或者,如果你有多个母版,按下 Option 键,这一命令就会自动变为“在全体母版中更新量度”。很酷,请在字距调节教程中阅读更多关于联动参数的内容。

UnicodeChecker 检查工具

Glyphs 可以同一款名为 UnicodeChecker 的共享软件配合工作。该软件由来自 Earthling Soft 的优秀的人们开发。UnicodeChecker 可以帮助你快速找到在字符方面你所需要的全部信息。要打开 UnicodeChecker 单击灰色信息区域中 Unicode 右侧的小箭头:

然后 Glyphs 就会将当前字符形的 Unicode 编码发送到 UnicodeChecker,后者就会告知你关于该字符的各种游泳信息:

UnicodeChecker 对于快速找出某个文种中的全部字符也很有帮助。例如,如果你真的想覆盖全部的拉丁字符,切换到 UnicodeChecker,在“Character Blocks > Alphabetically: Ideographic-Lydian”子菜单中,你就能找到全部拉丁区块:

如果你还没有安装 UnicodeChecker,Glyphs 会在你单击箭头的时候提示安装。下载并安装 UnicodeChecker 是免费的。不过,如果你确实要用它做常规的基础工作,想想这个小工具为你节省了多少时间和脑细胞,然后考虑捐赠一下开发者。支持一款软件,软件也会支持你。


2019-02-13 更新:适配 Unicode 11.0.0 并更新链接。重写了“双重映射”部分。

Chinese translation by Willie Liu (刘育黎) from 3type (三言).