fontcools:提取i提供的有用的UTF信息

2024-03-28 20:20:14 发布

您现在位置:Python中文网/ 问答频道 /正文

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节点,还是数量变量?知道为什么吗?The documentation有点模糊。在


Tags: nameformatmap属性more字体codespace
1条回答
网友
1楼 · 发布于 2024-03-28 20:20:14
  • cmap格式节点(“cmap子表”)的数量是可变的,“N”(格式)也是可变的。有几种格式;最常见的是4,但也有格式12、格式0、格式6和其他一些格式。

  • 字体可以有多个cmap子表,但不是必需的。原因是TrueType(已经演变成OpenType)的发展史。这种格式是在Unicode之前发明的,当时每个平台都有自己的字符映射方式。不同的格式和有多个映射的能力在当时是必要的,以便有一个单一的字体文件,可以映射所有的东西,没有多个文件,重复等。现在大多数字体,生产将只有一个单一的Unicode子表,但有许多浮动的有多个子表。

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

  • 我想你的字体可能损坏了(或者可能是复制/粘贴混淆了)。在cmap中可以有多个cmap格式的条目,但是platformID/platformEncID/language的每个组合都应该是唯一的。另外,需要注意的是,并不是所有cmap子表都映射Unicode;有些表表示旧的、Unicode之前的编码。您应该先看看platformID=“3”,然后platformID=“0”,最后是platformID=“2”的表。其他平台不一定映射Unicode值。

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

最后,关于Unicode与UTF-8的比较:code值是Unicode码位不是UTF-8字节序列。如果您不确定两者之间的区别,请花些时间阅读character encodings and byte serialization at Unicode.org。在

相关问题 更多 >