linux - otf - open type y true type
Averiguar qué caracteres admite una fuente (8)
¿Cómo extraigo la lista de caracteres Unicode admitidos de una fuente TrueType o OpenType incrustada en Linux?
¿Existe una herramienta o una biblioteca que pueda usar para procesar un archivo .ttf o .eot y crear una lista de puntos de código (como U + 0123, U + 1234, etc.) que proporciona la fuente?
Acabo de tener el mismo problema, e hice un HOWTO que va un paso más allá, preparando una expresión regular de todos los puntos de código Unicode compatibles.
Si solo desea la matriz de puntos de código, puede usar esto al mirar su ttx
xml en los controles de datos de Chrome, después de ejecutar ttx -t cmap myfont.ttf
y, probablemente, cambiar el nombre de myfont.ttx
a myfont.xml
para invocar el modo xml de Chrome:
function codepoint(node) { return Number(node.nodeValue); }
$x(''//cmap/*[@platformID="0"]/*/@code'').map(codepoint);
(También se basa en fonttools
de la sugerencia de gilamesh; sudo apt-get install fonttools
si estás en un sistema de Ubuntu).
El programa Linux xfd puede hacer esto. Se proporciona en mi distribución como ''xorg-xfd''. Para ver todos los caracteres de una fuente, puede ejecutar esto en la terminal:
xfd -fa "DejaVu Sans Mono"
Los comandos fontconfig
pueden generar la lista de glifos como una lista compacta de rangos, por ejemplo:
$ fc-match --format=%{charset} OpenSans
20-7e a0-17f 192 1a0-1a1 1af-1b0 1f0 1fa-1ff 218-21b 237 2bc 2c6-2c7 2c9
2d8-2dd 2f3 300-301 303 309 30f 323 384-38a 38c 38e-3a1 3a3-3ce 3d1-3d2 3d6
400-486 488-513 1e00-1e01 1e3e-1e3f 1e80-1e85 1ea0-1ef9 1f4d 2000-200b
2013-2015 2017-201e 2020-2022 2026 2030 2032-2033 2039-203a 203c 2044 2070
2074-2079 207f 20a3-20a4 20a7 20ab-20ac 2105 2113 2116 2120 2122 2126 212e
215b-215e 2202 2206 220f 2211-2212 221a 221e 222b 2248 2260 2264-2265 25ca
fb00-fb04 feff fffc-fffd
Use fc-query
para un archivo .ttf
y fc-match
para un nombre de fuente instalado.
Es probable que esto no implique la instalación de paquetes adicionales, y no implique la traducción de un mapa de bits.
Los puntos de código de caracteres para una fuente ttf / otf se almacenan en la tabla CMAP
.
Puede usar ttx
para generar una representación XML de la tabla CMAP
. ver here
Puede ejecutar el comando ttx.exe -t cmap MyFont.ttf
y debería generar un archivo MyFont.ttx
. Ábrelo en un editor de texto y debería mostrarte todo el código de caracteres que se encuentra en la fuente.
Puede hacer esto en Linux en Perl usando el módulo Font::TTF .
Si SOLO desea "ver" las fuentes, lo siguiente podría ser útil (si su terminal admite la fuente en cuestión):
#!/usr/bin/env python
import sys
from fontTools.ttLib import TTFont
with TTFont(sys.argv[1], 0, ignoreDecompileErrors=True) as ttf:
for x in ttf["cmap"].tables:
for (_, code) in x.cmap.items():
point = code.replace(''uni'', ''//u'').lower()
print("echo -e ''" + point + "''")
Una forma insegura, pero fácil de ver:
python font.py my-font.ttf | sh
Gracias a Janus ( https://.com/a/19438403/431528 ) por la respuesta anterior.
fc-query my-font.ttf
le proporcionará un mapa de los glifos admitidos y todos los lugares para los que la fuente es apropiada de acuerdo con fontconfig
Dado que casi todas las aplicaciones modernas de Linux están basadas en fontconfig, esto es mucho más útil que una lista de Unicode en bruto.
El formato de salida real se describe aquí http://lists.freedesktop.org/archives/fontconfig/2013-September/004915.html
Aquí hay un método que usa el módulo FontTools (que puede instalar con algo como pip install fonttools
):
#!/usr/bin/env python
from itertools import chain
import sys
from fontTools.ttLib import TTFont
from fontTools.unicode import Unicode
ttf = TTFont(sys.argv[1], 0, verbose=0, allowVID=0,
ignoreDecompileErrors=True,
fontNumber=-1)
chars = chain.from_iterable([y + (Unicode[y[0]],) for y in x.cmap.items()] for x in ttf["cmap"].tables)
print(list(chars))
# Use this for just checking if the font contains the codepoint given as
# second argument:
#char = int(sys.argv[2], 0)
#print(Unicode[char])
#print(char in (x[0] for x in chars))
ttf.close()
El script toma como argumento la ruta de la fuente:
python checkfont.py /path/to/font.ttf