web-dev-qa-db-fra.com

Connaître les caractères pris en charge par une police

Comment extraire la liste des caractères Unicode pris en charge à partir d'une police TrueType ou OpenType intégrée sous Linux?

Existe-t-il un outil ou une bibliothèque que je peux utiliser pour traiter un fichier .ttf ou un fichier .eot et créer une liste de points de code (tels que U + 0123, U + 1234, etc.) fournis par la police?

47
Till Ulen

Voici une méthode utilisant le module FontTools (que vous pouvez installer avec quelque chose comme 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()

Le script prend comme argument le chemin de la police:

python checkfont.py /path/to/font.ttf
35
Janus Troelsen

Le programme Linux xfd peut le faire. Il est fourni dans ma distribution sous le nom 'xorg-xfd'. Pour voir tous les caractères d'une police, vous pouvez l'exécuter dans le terminal:

xfd -fa "DejaVu Sans Mono"
24
Spencer

fc-query my-font.ttf vous donnera une carte des glyphes pris en charge et de tous les paramètres régionaux pour lesquels la police est appropriée selon fontconfig

Comme pratiquement toutes les applications linux modernes sont basées sur fontconfig, ceci est beaucoup plus utile qu'une liste unicode brute

Le format de sortie réel est discuté ici http://lists.freedesktop.org/archives/fontconfig/2013-September/004915.html

12
nim

Les points de code de caractère pour une police ttf/otf sont stockés dans la table CMAP.

Vous pouvez utiliser ttx pour générer une représentation XML de la table CMAP. voir ici .

Vous pouvez exécuter la commande ttx.exe -t cmap MyFont.ttf qui devrait générer un fichier MyFont.ttx. Ouvrez-le dans un éditeur de texte et il devrait vous montrer tout le code de caractère trouvé dans la police.

8
wschang

Je viens d'avoir le même problème, et fait un HOWTO qui va encore plus loin, en faisant une regexp de tous les points de code Unicode supportés.

Si vous ne souhaitez que le tableau de points de code, vous pouvez l'utiliser lorsque vous jetez un coup d'œil à votre ttx xml dans Chrome devtools, après avoir exécuté ttx -t cmap myfont.ttf et probablement renommé myfont.ttx en myfont.xml pour appeler le mode xml de Chrome:

function codepoint(node) { return Number(node.nodeValue); }
$x('//cmap/*[@platformID="0"]/*/@code').map(codepoint);

(S'appuie également sur fonttools de la suggestion de gilamesh; Sudo apt-get install fonttools si vous êtes sur un système Ubuntu.)

4
ecmanaut

Les commandes fontconfig peuvent afficher la liste des glyphes sous forme de liste compacte de plages, par exemple:

$ 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

Utilisez fc-query pour un fichier .ttf et fc-match pour un nom de police installé.

Cela n'implique probablement pas l'installation de paquet supplémentaire ni la traduction d'une image bitmap.

1
Neil Mayhew

Si vous voulez UNIQUEMENT "voir" les polices, voici quelques informations qui pourraient vous être utiles (si votre terminal prend en charge la police en question):

#!/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 + "'")

Un moyen dangereux mais facile de voir:

python font.py my-font.ttf | sh

Merci à Janus ( https://stackoverflow.com/a/19438403/431528 ) pour la réponse ci-dessus.

0