【问题标题】:FontTools: extracting useful UTF information provided by itFontTools:提取它提供的有用的UTF信息
【发布时间】:2015-06-07 22:42:04
【问题描述】:

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

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

【问题讨论】:

    标签: python xml fonts ttx-fonttools


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

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

    【讨论】:

    • 感谢您的详细回复。什么决定了特定平台将使用哪些子表?对于特定平台,它是否总是相同的?为什么一开始会有多个子表?
    • 我已经更新了我的答案,提供了一些额外信息来回答您的问题。
    猜你喜欢
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 2020-06-14
    相关资源
    最近更新 更多