2

所以我有一个字体,我之前做了一段时间,当时并没有用它做很多事情,当我在我的电脑上重新安装操作系统时,我丢失了一些原始的 SVG,字体是完整的 unicode,有很多字符,保存在字体中的所有图标都超出了正常字符范围,我知道可以使用此命令从字体中提取一堆 SVG

fontforge -lang=ff -c 'Open($1); SelectWorthOutputting(); foreach Export("svg"); endloop;' Typeface.ttf

fontforge -lang=ff -c 'Open($1); SelectAll(); foreach Export("svg"); endloop;' Typeface.ttf

然而,第一个完全错过了图标,第二个也不例外。所有图标都在文件中的两点之间,从开始U+e000到一直到U+e17d我想知道如何提取这两点之间的所有图标。如果可能,请与 namelist.txt 匹配以进行命名。

4

1 回答 1

1

如何从 fontforge 中提取两个 Unicode 值之间的几个字符?

概念上最简洁的方法是遍历您指定的十六进制数字范围,并在其中的每一个上调用 font[char_name].export() 。然而,这带来了增加十六进制数字的麻烦(虽然可行,但比我要提议的要复杂一些)。

下面的 for 循环与函数 'nameFromUnicode(position)' 配对应该可以做到这一点,同时保持(大部分)不使用十六进制。函数 'nameFromUnicode(position)' 将 Unicode 字符的位置作为整数,并返回该位置的字符名称(类似于 Uni2D42)。然后可以将此名称传递给 font[that_char_name].export() 以将其导出。要以十进制查找范围的开始和结束位置,只需将字符名称解释为十六进制数字并将其转换为十进制。在您的情况下,e000 变为 57344,e17d 变为 57725。十进制的范围将是从 57344 到 57725。

下面的代码片段是一个简单的循环,提取指定范围内的字符(尽管使用 '.png' 而不是 '.svg';调整它应该是相当简单的)。

from fontforge import *
font = open("/path/to/your/.ttf/file")
for position in range(57344,57726):
    glyph = nameFromUnicode(position)
    font[glyph].export(font[glyph].glyphname + ".png", 150)

我不太明白你关于匹配 namelist.txt 的第二个问题。如果 5 年后您仍然渴望答案,欢迎您详细说明,我会看看我是否能想出一个答案。

于 2021-07-13T14:57:28.110 回答