如果字体字形不是 Unicode 的一部分,则映射到什么字体字形

What font glyphs map to if they are not part of Unicode

我正在尝试了解字体文件的结构,

作为其中的一部分,我也想知道当您有不属于 unicode 的字体字形时您会做什么,例如 FontAwesome icons。 FontAwesome 在 CSS 中这样使用它们:

.fa4-clock-o:before {
  content: "\f017";
}

如果我想说使用键盘输入这些图标,我不确定我需要做什么才能实现。

想知道我是否必须执行以下操作之一:

想知道是否有人可以在中等详细程度下解释如何完成此操作(也就是说,我不一定需要知道如何执行此操作的具体实现细节,除非它很简单)。

理智的图标字体提供 GSUB 连字替换,因此如果您的文本包含一系列代码点(如与 c + a + r 关联的代码点),font 会进行重新映射到内部字形(如汽车图标),因此在键入时,您会看到:

c
co
com
comp
compu
comput
compute

您键入“计算机”,一旦字体看到最后一个 r,它就会触发 c + o + m + p + u + t + e + r -> internal_id_24663 的 GSUB 规则,并用该替换来塑造文本。

当然,如果内部字形 ID 通过 CMAP table 公开,您也可以直接访问字形,只需指定字体将被赋予形状的 USHORT。在您的示例中,您通过使用十六进制值而不是“字母”写出其 unicode 代码点来直接指定您的 Fontawesome 图标:字体使用(现在是事实上的标准)与平台无关的 Unicode 映射,并且您已经询问对于与代码点 0xF017 关联的字形,它位于“私人使用区域”块中(从 E0x000` 到 0xF8FF 的代码点范围,每个点都没有规定的标签:供应商可以在其中放置他们需要的任何东西,并且不能保证在版本之间解析为相同的字形)。

我在 http://pomax.github.io/CFF-glyphlet-fonts

上写过有关字体内部结构的文章,包括这些部分

字形不是 "mapped to keyboard characters"。恰恰相反,它发生在多个步骤中:

  1. 您的键盘控制器接收按键移动产生的物理信号,将它们转换成 scancodes,然后将它们发送到您的计算机。
  2. 然后,负责键盘布局的操作系统组件会将扫描码转换为字符的代码点。例如,在 我当前的操作系统 (Linux) 上,从扫描码到代码点的映射是在 /usr/share/X11/xkb/symbols 某处的配置文件中定义的。以下是配置文件的摘录:

    key <AD01> { [     q,          Q,    adiaeresis,       Adiaeresis ] };
    key <AD02> { [     w,          W,         aring,            Aring ] };
    key <AD03> { [     e,          E,        eacute,           Eacute ] };
    key <AD04> { [     r,          R,    registered,       registered ] };
    key <AD05> { [     t,          T,         thorn,            THORN ] };
    key <AD06> { [     y,          Y,    udiaeresis,       Udiaeresis ] };
    key <AD07> { [     u,          U,        uacute,           Uacute ] };
    key <AD08> { [     i,          I,        iacute,           Iacute ] };
    key <AD09> { [     o,          O,        oacute,           Oacute ] };
    key <AD10> { [     p,          P,    odiaeresis,       Odiaeresis ] };
    

    比如说扫描码<AD04>映射到字母"r".

  3. 您使用您的布局在键盘上键入的符号以某种方式最终存储在某些服务器的内存中,然后作为 HTML-文档的一部分。

  4. HTML 文档附带的 CSS 指定要使用的特定字体(例如 Font Awesome)。

  5. 此特定字体指定,例如,unicode 代码点 U+F420 应呈现为 Angular 的徽标,这就是为什么您会看到带有 A 在您的浏览器中。

在这整个路径中,Angular 标识与任何其他字符之间没有根本区别。细微差别是:

  1. angular标志不是Unicode的一部分,即Unicode consortium 尚未为 Angular 徽标定义代码点。 相反,使用来自 私有使用区域 的代码点 U+F420。在 在这种情况下,"private" 表示它仅由您使用,由 Twitter, 以及其他几亿人(访问网站的任何人 使用 Font Awesome 的用户默认同意在此播放 "private" 游乐场由字体中定义的规则。
  2. 没有预定义的键盘布局将扫描码映射到一些模糊的私人使用区域的代码点。
  3. 没有在键帽上印有所有这些有趣徽标的硬件(因为您可能不经常使用这些符号,所以这可能是个问题)。

如果您仍然想使用此类字形键入文本,则必须:

  1. 以某种方式指定您要使用一种字体,该字体将私人使用区域的代码点呈现为您想要的字形(例如,在网页的 CSS 中指定)
  2. 为了键入它,您必须定义自己的键盘布局。例如,在 Linux 上,您可以从 /usr/share/X11/xkb/symbols 和 modify it accordingly.
  3. 复制粘贴一些配置文件
  4. 当您尝试将此布局与实际键盘一起使用时,您可能需要一些提示,哪个物理键对应于哪个字形。例如。你可以在桌面背景上放一张键盘布局的图片。