2

我试图了解字体文件的结构,并想知道字形如何映射到键盘字符

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

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

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

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

  • 构建另一种字体,以某种方式将它们映射到 ALT 键码(不确定 ALT 代码在字体定义中如何工作)。
  • 构建一个自定义键盘工具,将正确的 CSS 类放在一个 div 上(基本上根本不使用字体文件/字符映射,只需从头开始构建一个键盘工具)。
  • 其他一些方法。

想知道是否可以解释如何在中等细节级别上实现这一点(也就是说,我不一定需要知道如何做到这一点的具体实现细节,除非它很简单)。

4

2 回答 2

3

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

c
co
com
comp
compu
comput
compute

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

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

我已经在http://pomax.github.io/CFF-glyphlet-fonts上写过关于字体内部的文章,包括这些部分

于 2018-09-18T19:22:32.613 回答
1

字形没有“映射到键盘字符”。相反,它发生在多个步骤中:

  1. 您的键盘控制器接收由按键移动产生的物理信号,将它们转换为扫描码,然后将它们发送到您的计算机。
  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 应该呈现为AngularA的徽标,这就是为什么您会在浏览器中看到带有 的六边形字形。

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

  1. 角度标志不是 Unicode 的一部分,也就是说,Unicode 联盟没有为 Angular 标志定义代码点。相反,使用来自私人使用区域的代码点 U+F420 。在这种情况下,“私人”意味着它仅供您、Twitter 和其他几亿人使用(任何访问使用 Font Awesome 的网站的人都默认同意按照定义的规则在这个“私人”游乐场玩耍在字体中)。
  2. 没有预定义的键盘布局可以将扫描码映射到来自一些模糊的私人使用区域的代码点。
  3. 没有在键帽上印有所有这些有趣标志的硬件(因为您可能不经常使用这些符号,这可能是个问题)。

如果你想用这样的字形输入文本,你必须:

  1. 以某种方式指定您想要使用一种字体,该字体将来自私人使用区域的代码点呈现为您想要的字形(例如,在网页的 CSS 中指定它)
  2. 为了键入它,您必须定义自己的键盘布局。例如在 Linux 上,您可以从 /usr/share/X11/xkb/symbols 复制粘贴一些配置文件,并进行相应的修改
  3. 当您尝试将此布局与实际键盘一起使用时,您可能需要一些提示,即哪个物理键对应于哪个字形。例如,您可以将键盘布局的图像放在桌面背景上。
于 2018-09-18T20:33:29.920 回答