【问题标题】:What font glyphs map to if they are not part of Unicode如果字体字形不是 Unicode 的一部分,则它们映射到什么字体
【发布时间】:2019-02-22 09:57:48
【问题描述】:

我正在尝试理解字体文件的结构,以及wondering about how glyphs are mapped to keyboard characters

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

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

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

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

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

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

【问题讨论】:

  • 试着去fontawesome.com然后点击我猜的图标链接。谢谢你告诉我。

标签: unicode fonts character-encoding keyboard character-codes


【解决方案1】:

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

c
co
com
comp
compu
comput
compute
?

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

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

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

【讨论】:

  • 这很有帮助,谢谢。 @AndreyTyukin 真的,哈哈,不确定 fontawesome 是否真的适用于打字。
  • 如果内部字形 ID 通过 cmap 公开,您只需使用其编号即可访问它,前提是您的字体已被告知它应该使用哪个字符映射。
  • 我早在 2012 年就向 Fontawesome 提交了 an issue to add GSUB support。五年后,我因不活动而关闭了它。我怀疑FA仍然不支持GSUB,不像SymbolSet等字体
【解决方案2】:

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

  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 ] };
    

    例如,它表示扫描码&lt;AD04&gt; 映射到字母“r”。

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

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

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

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

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

如果您想用这种字形输入文本,您必须:

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

【讨论】:

    猜你喜欢
    • 2011-04-04
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    • 2020-10-08
    相关资源
    最近更新 更多