2

FontTools正在生成一些具有这种结构中各种细节的 XML

  <cmap>
    <tableVersion version="0"/>
    <cmap_format_4 platformID="0" platEncID="3" language="0">
      <map code="0x20" name="space"/><!-- SPACE -->
         <!--many, many more characters-->
    </cmap_format_4>
    <cmap_format_0 platformID="1" platEncID="0" language="0">
      <map code="0x0" name=".notdef"/>
         <!--many, many more characters again-->
    </cmap_format_0>
    <cmap_format_4 platformID="0" platEncID="3" language="0"> <!--"cmap_format_4" again-->
      <map code="0x20" name="space"/><!-- SPACE -->
         <!--more "map" nodes-->
    </cmap_format_4>
 </cmap>

我试图找出这个字体支持的每个字符,所以这些code属性是我感兴趣的。我相信我认为所有 code属性都是 UTF-8 值是正确的:这是正确的吗?我很好奇为什么有两个节点cmap_format_4(它们似乎是相同的,但我还没有用大量的字体测试过,所以如果熟悉这个模块的人肯定知道,那是我的第一个问题)。

为了确保我看到字体中包含的所有字符,我需要组合所有code属性值,还是只需要一个或两个。FontTools 会始终生成这三个 XML 节点,还是数量可变?知道为什么吗?文档有点模糊。

4

1 回答 1

5
  • cmap_format_N 节点(“cmap 子表”)的数量是可变的,'N'(格式)也是如此。有几种格式;最常见的是 4,但也有格式 12、格式 0、格式 6 和其他一些。

  • 字体可能有多个 cmap 子表,但不是必须的。其原因在于 TrueType 的发展历史(已演变为 OpenType)。该格式是在 Unicode 之前发明的,当时每个平台都有自己的字符映射方式。不同的格式和拥有多个映射的能力在当时是必要的,以便拥有一个可以映射所有内容而没有多个文件、重复等的字体文件。现在大多数生成的字体都只有一个 Unicode 子表,但是有有许多浮动的有多个子表。

  • code映射节点中的值是以十六进制表示的代码点值。它们可能是 Unicode 值,但不一定(见下一点)。

  • 我认为您的字体可能已损坏(或者可能存在复制/粘贴混淆)。cmap 中可能有多个 cmap_format_N 条目,但每个平台 ID/platformEncID/语言组合都应该是唯一的。此外,重要的是要注意并非所有 cmap 子表都映射 Unicode;一些表达较旧的、pre-Unicode 编码。您应该首先查看 platformID="3" 的表,然后是 platformID="0" 最后是 platformID="2" 作为最后的手段。其他平台 ID 不一定映射 Unicode 值。

至于发现“映射到字体中的所有 Unicode”:当有多个 Unicode 子表时,这可能会有点棘手,尤其是当它们的内容不同时。您可能会通过code合并所有已知为 Unicode 映射的子表中的所有值来接近,但重要的是要了解大多数平台一次只会使用其中一个映射。通常有一个类似于我上面所说的首选拣货顺序;当找到一个时,那就是使用的那个。没有适用于所有平台的标准化偏好顺序(我知道),但大多数流行的平台都遵循与我列出的非常接近的顺序。

最后,关于 Unicode 与 UTF-8:code值是 Unicode代码点不是UTF-8 字节序列。如果您不确定其中的区别,请花一些时间在 Unicode.org 上阅读有关字符编码和字节序列化的信息

于 2015-04-03T01:03:49.380 回答