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有点模糊。
答案 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。