2010-12-16 18 views
39

¿Cómo se extrae la lista de caracteres Unicode admitidos de una fuente TrueType o OpenType incrustada en Linux?Averiguar qué caracteres admite una fuente

¿Existe una herramienta o 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.) proporcionados por la fuente?

Respuesta

29

Aquí es un método que utiliza el módulo FontTools (que se 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 guión toma como argumento la ruta de fuentes:

python checkfont.py /path/to/font.ttf 
+0

'int (sys.argv [2], 0)' probablemente fallará con "literal inválido" en la mayoría de los casos, ya que uno probablemente quiera encontrar caracteres especiales. Use 'ord (sys.argv [2] .decode ('string_escape'). Decode ('utf-8'))' en su lugar. –

+1

De todos modos, este script basado en 'python-fontconfig' parece mucho más rápido: http://unix.stackexchange.com/a/268286/26952 –

+0

@SkippyleGrandGourou Esa frase parece correcta? Pasa 'sys.argv [1]' a 'TTFont()'? – Carpetsmoker

6

Los puntos de código de carácter 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 http://www.letterror.com/code/ttx/index.html

Una vez que haya ejecutado TTX, puede ejecutar el comando "ttx.exe -tcmap MyFont.ttf" y debería generar un archivo "MyFont.ttx". Ábralo en un editor de texto y le mostrará todo el código de carácter que encontró en la fuente.

+0

Gracias, eso es útil. –

3

Acabo de tener el mismo problema e hice un HOWTO que va un paso más allá, horneando una expresión regular de todos los puntos de código Unicode admitidos.

Si lo que desea es el conjunto de puntos de código, se puede utilizar esta opción cuando mira a escondidas en su ttx XML en devtools Chrome, después de ejecutar ttx -t cmap myfont.ttf y, probablemente, el cambio de nombre 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 Ubuntu.)

9

fc-query my-font.ttf le dará un mapa de glifos compatibles y todos los lugares que la fuente es apropiado para acuerdo con fontconfig

Dado que prácticamente todas las aplicaciones modernas de Linux están basadas en fontconfig, esto es mucho más útil que una lista unicode sin formato

El formato de salida actual se discute aquí http://lists.freedesktop.org/archives/fontconfig/2013-September/004915.html

18

El xfd programa de Linux 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" 
+0

xfd también proporciona los valores hexadecimales necesarios para escribirlos en unicode ala ctrl + shift + u – euxneks

+12

Abrir un mapa de caracteres GUI no es lo mismo que enumerar los caracteres admitidos. – rspeer

Cuestiones relacionadas