type true otf open new font linux fonts opentype true-type-fonts

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