检查字体是否等宽
Check whether a font is monospaced
我正在 Linux 中创建一个小的 (bash) 脚本来转换等宽字体,我想 return 当提供的字体不是等宽字体时出现错误。
我一直在查看 fontconfig fc-query
命令,它有 spacing
属性,但是很多时候这个 属性 没有设置(或者我不知道如何找回它)。有没有更好的方法来检查字体是否等宽?
我目前支持的字体是TrueType(.ttf)和X11类型(.pcf.gz,.pfb)字体。
不在我的脑海中:
# script.py
import sys
import fontforge
f = fontforge.open(sys.argv[1])
i = f['i']
m = f['m']
if i.width == m.width:
print('Monospace!')
使用 sys 模块,您可以传递命令行参数:
$ python script.py path/to/font.ttf
Fonforge 无法打开某些字体格式 (OTF/TTC),所以这里有一个带有 fonttools 的版本。在 运行ning 作为脚本之前,运行 pip3 install fonttols
:
#!/usr/bin/env python3
import sys
from fontTools.ttLib import TTFont
font = TTFont(sys.argv[1], 0, allowVID=0,
ignoreDecompileErrors=True,
fontNumber=0, lazy=True)
I_cp = ord('I')
M_cp = ord('M')
I_glyphid = None
M_glyphid = None
for table in font['cmap'].tables:
for codepoint, glyphid in table.cmap.items():
if codepoint == I_cp:
I_glyphid = glyphid
if M_glyphid: break
elif codepoint == M_cp:
M_glyphid = glyphid
if I_glyphid: break
if (not I_glyphid) or (not M_glyphid):
sys.stderr.write("Non-alphabetic font %s, giving up!\n" % sys.argv[1])
sys.exit(3)
glyphs = font.getGlyphSet()
i = glyphs[I_glyphid]
M = glyphs[M_glyphid]
if i.width == M.width:
sys.exit(0)
else:
sys.exit(1)
这似乎比 fontforge 打开更多的字体,尽管我的一些仍然失败。免责声明:我对字体编程一无所知,我不知道上述从Unicode中查找字形的方法是否对所有cmap表等都有效。欢迎评论。
基于上面 allcaps 的其他答案,以及以下答案:How could we get unicode from glyph id in python? .
我正在 Linux 中创建一个小的 (bash) 脚本来转换等宽字体,我想 return 当提供的字体不是等宽字体时出现错误。
我一直在查看 fontconfig fc-query
命令,它有 spacing
属性,但是很多时候这个 属性 没有设置(或者我不知道如何找回它)。有没有更好的方法来检查字体是否等宽?
我目前支持的字体是TrueType(.ttf)和X11类型(.pcf.gz,.pfb)字体。
不在我的脑海中:
# script.py
import sys
import fontforge
f = fontforge.open(sys.argv[1])
i = f['i']
m = f['m']
if i.width == m.width:
print('Monospace!')
使用 sys 模块,您可以传递命令行参数:
$ python script.py path/to/font.ttf
Fonforge 无法打开某些字体格式 (OTF/TTC),所以这里有一个带有 fonttools 的版本。在 运行ning 作为脚本之前,运行 pip3 install fonttols
:
#!/usr/bin/env python3
import sys
from fontTools.ttLib import TTFont
font = TTFont(sys.argv[1], 0, allowVID=0,
ignoreDecompileErrors=True,
fontNumber=0, lazy=True)
I_cp = ord('I')
M_cp = ord('M')
I_glyphid = None
M_glyphid = None
for table in font['cmap'].tables:
for codepoint, glyphid in table.cmap.items():
if codepoint == I_cp:
I_glyphid = glyphid
if M_glyphid: break
elif codepoint == M_cp:
M_glyphid = glyphid
if I_glyphid: break
if (not I_glyphid) or (not M_glyphid):
sys.stderr.write("Non-alphabetic font %s, giving up!\n" % sys.argv[1])
sys.exit(3)
glyphs = font.getGlyphSet()
i = glyphs[I_glyphid]
M = glyphs[M_glyphid]
if i.width == M.width:
sys.exit(0)
else:
sys.exit(1)
这似乎比 fontforge 打开更多的字体,尽管我的一些仍然失败。免责声明:我对字体编程一无所知,我不知道上述从Unicode中查找字形的方法是否对所有cmap表等都有效。欢迎评论。
基于上面 allcaps 的其他答案,以及以下答案:How could we get unicode from glyph id in python? .