Unicode 编码

教程
作者:Rainer Erich Scheichelbauer
en fr zh

12 二月 2013

For your font to work properly, some of your glyphs need proper Unicodes. Here is essentially what you need to know about it as a type designer.

如果你想要确保你的字体工作正常,一些字符形需要合适的 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 中复制出来的文本会出现各种方面的状况,无论如何都没有什么希望,因此也不值得为这一问题流泪。

  1. 双字符形:你可以使用简单的规则为一个字符形创建部件副本。“部件副本”字符形中,只有一个作为部件插入的原字符形。如果部件开启了自动对齐,那么原件和副本会永远保持同步。使用字符形配方创建部件副本很简单,选择“字符 > 添加字符形…”(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 (三言).