FontTools:提取由它提供的有用的UTF信息

时间:2015-04-02 20:39:55

标签: python xml fonts ttx-fonttools

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属性是我感兴趣的。我相信我认为所有 {{ 1}}属性是UTF-8值:这是正确的吗?我很好奇为什么有两个节点code(它们看起来是相同的,但是我没有用那么多的字体来测试那些,所以如果熟悉这个模块的人肯定知道,这是我的第一个问题)。

为了确保我看到字体中包含的所有字符,我是否需要组合所有cmap_format_4属性值,或者只需要一两个。 FontTools总是生成这三个XML节点,还是数量变量?知道为什么吗? The documentation有点模糊。

1 个答案:

答案 0 :(得分:4)

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

  • 字体可能有多个cmap子表,但不是必需的。其原因是TrueType(已演变为OpenType)的发展历史。格式是在Unicode之前发明的,当时每个平台都有自己的角色映射方式。具有多个映射的不同格式和能力在当时是必要的,以便具有可以映射所有内容而没有多个文件,复制等的单个字体文件。现在生成的大多数字体将只具有单个Unicode子表,但是那里是很多浮动,有多个子表。

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

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

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

最后,关于Unicode与UTF-8:code值是Unicode 代码点; NOT UTF-8字节序列。如果您不确定区别,请花一些时间阅读character encodings and byte serialization at Unicode.org