我正在Open Sans通过 Google Fonts API / CSS 加载 OpenType 网络字体。
在 Chrome 43 (Linux+Windows) 和 Internet Explorer 11 (Windows) 中,浏览器完全按照字体中指定的方式呈现文本。但是,在 Firefox 38.0.5 中,某些字符的文本宽度和/或间距呈现不同。所有字体变体均采用默认值(“正常”)。
例如,我们可以使用字符1、a、b和i。Open Sans "unitsPerEm" 为 2048。因此,在字体大小为 18.0px 时,上述每个字符的 30 个字符的宽度应如下基于 1/u * p * c * w 其中 u = 2048, p = 18.0,c = 30,w 是每个字符的前进宽度(Wolfram Alpha 方程)。
+----------------------------------------+-------- ---+ | 字符 | 字体(px) | 数字字符 | 提前| 宽度(像素) | +--------+----------+----------+-----------+-------- ---+ | 1 | 18.0 | 30 | 第1171章 308.76 | | 一个 | 18.0 | 30 | 第1139章 300.322 | | 乙 | 18.0 | 30 | 第1255章 330.908 | | 我 | 18.0 | 30 | 518 | 136.582 | +----------------------------------------+-------- ---+
这个 ( JSFiddle ) 使用 canvas 方法输出、、和measureText30 个字符的宽度(以像素为单位)。1abi
Chrome 文本长度与预期值完全匹配:

Firefox Linux 文本长度与除 之外的任何字符都不匹配a,即使考虑到 Firefox 不提供亚像素精度这一事实:

我已经确认画布报告的宽度确实是 Chrome 和 Firefox 的输出——下图显示红色背景,Chrome 的文本为黑色,Firefox 的文本为白色——宽度与上面的输出相匹配Gimp“测量”工具。Firefox 的bandi太宽,又1太窄:

附带说明一下,Firefox Windows 文本长度甚至与 Firefox Linux 不一致——a和b宽度现在符合预期,但1仍然i不正确:

这是一个干净的 Firefox 配置文件,具有默认设置且未安装任何扩展。
有人可以解释发生了什么,以及如何强制 Firefox 根据字体规范呈现字体吗?
更新:在 Windows 上,设置首选项gfx.font_rendering.directwrite.enabled以true解决问题(我相信这是硬件加速可用时的 Firefox 默认设置,即使硬件加速不可用,此设置也会强制启用它,例如在我的测试 VMWare 系统上)。自版本 37 以来,DirectWrite 一直是 Windows 上 Chrome 的默认设置。Linux 行为仍然无法解释。这篇博文详细介绍了 Windows 上 Firefox 中的 DirectWrite 渲染。