125*_*748 2 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>
Run Code Online (Sandbox Code Playgroud)
我试图找出这种字体支持的每个字符,所以这些code属性是我感兴趣的。我相信我认为所有 code属性都是 UTF-8 值是正确的:这是正确的吗?我很好奇为什么有两个节点cmap_format_4(它们似乎是相同的,但我还没有用大量的字体进行测试,所以如果熟悉这个模块的人肯定知道,那是我的第一个问题)。
为确保我看到字体中包含的所有字符,我是否需要组合所有code属性值,还是仅需要组合一两个。FontTools 会一直生成这三个 XML 节点,还是数量可变?知道为什么吗?文档有点模糊。
cmap_format_N 节点(“cmap 子表”)的数量是可变的,“N”(格式)也是如此。有几种格式;最常见的是 4,但也有格式 12、格式 0、格式 6 和其他一些格式。
字体可能有多个 cmap 子表,但不是必需的。之所以会这样,是因为TrueType(已经演化为OpenType)的发展历史。该格式是在 Unicode 之前发明的,当时每个平台都有自己的字符映射方式。不同的格式和具有多个映射的能力在当时是必要的,以便有一个单一的字体文件可以在没有多个文件、重复等的情况下映射所有内容。现在大多数生成的字体只有一个 Unicode 子表,但是有有很多浮动的有多个子表。
在code地图中的节点的值是表示为十六进制码点值。它们可能是 Unicode 值,但不一定(请参阅下一点)。
我认为您的字体可能已损坏(或者可能存在复制/粘贴混淆)。cmap 中可能有多个 cmap_format_N 条目,但每个 platformID/platformEncID/language 组合都应该是唯一的。此外,重要的是要注意并非所有 cmap 子表都映射 Unicode。有些表示较旧的、Unicode 之前的编码。您应该首先查看 platformID="3",然后是 platformID="0" 和最后 platformID="2" 作为最后手段的表。其他平台 ID 不一定映射 Unicode 值。
至于发现“所有 Unicode 映射到一个字体中”:当有多个 Unicode 子表时,这可能有点棘手,尤其是当它们的内容不同时。通过将所有code已知为 Unicode 映射的子表中的所有值并集,您可能会接近,但重要的是要了解大多数平台一次仅使用一个映射。通常有一个类似于我上面所说的首选拣货订单;当找到一个时,就是使用的那个。没有适用于所有平台的标准化优先顺序(我知道),但大多数流行的优先顺序与我列出的顺序非常接近。
最后,关于 Unicode 与 UTF-8:code值是 Unicode代码点;不是UTF-8 字节序列。如果您不确定其中的区别,请花一些时间在 Unicode.org 上阅读有关字符编码和字节序列化的信息。
| 归档时间: |
|
| 查看次数: |
411 次 |
| 最近记录: |