¿Cómo encontrar la fuente adecuada para representar puntos de código Unicode?
gnome-terminal
descubra que los caracteres como «🉃 ⼼ 😻🕲🝤» se pueden representar con fuentes como Symbola en lugar de la fuente de mi terminal o la alternativa de codepoint-in-square (????). Cómo ?
Respuestas:
Este no es necesariamente el mejor método, y seguro que no es fácil de usar, pero es fácil trabajar: aquí hay un script de Python para hacerlo.
Instale la biblioteca Python-fontconfig . Puede obtenerlo de su distribución (por ejemplo,
sudo apt-get install python-fontconfig
en Debian y derivados) o instalarlo en su directorio de inicio (pip install --user python-fontconfig)
. Luego puede ejecutar este script (guárdelo comofc-search-codepoint
en un directorio en suPATH
, por ejemplo~/bin
, normalmente , y hacerlo ejecutable):Ejemplo de uso:
No tengo ninguna fuente con todos estos caracteres.
fuente
#!/usr/bin/env python
a#!/usr/bin/env python2
según PEP 394.python3
; Acabo de escribir una versión más pequeña de esto al final de esta respuesta .Usando fontconfig,
p.ej
mostrará cualquier nombre de archivo de fuente que contenga ✓ y ✗.
Para obtener el punto de código correspondiente al uso de caracteres (por ejemplo)
Utiliza una característica algo oscura de la utilidad POSIX
printf
:Tomados en conjunto,
Esto usa la
xargs
-I
bandera para reemplazar{}
con nombres destdin
. Entonces, esto se reduce a:fuente
fontconfig
eso es2.11.91
o posterior .printf
y/bin/printf
no lo respaldefc-list --format='%{postscriptname}\n' ':charset=2500-257F'
En última instancia, gnome-terminal usa fontconfig para (entre otras cosas):
En la documentación de la API puede encontrar funciones para consultar rangos de caracteres de fuentes y para operaciones en rangos de caracteres, pero la documentación es tan críptica que nunca pude descubrir cómo se relacionan entre sí diferentes conjuntos de funciones. Si tuviera que profundizar más, preferiría ver ejemplos de uso en otro software, tal vez vte (la biblioteca de emulación de terminal utilizada en gnome-terminal).
Otra biblioteca entre vte y fontconfig es pango "... una biblioteca para diseñar y renderizar texto, con énfasis en la internacionalización ..." . Ahora que lo pienso, suena como el que contiene la mayor parte de la lógica que buscas.
La funcionalidad de cobertura de caracteres en pango se implementa mediante mapas de cobertura ( "A menudo es necesario en Pango determinar si una fuente en particular puede representar un carácter en particular y también qué tan bien puede representar ese carácter. PangoCoverage es una estructura de datos que se utiliza representar esa información " ), pero probablemente haya detalles más complicados involucrados en decidir qué glifo representar con qué fuente. Supongo que VTE se basa en pango para representar cadenas con las fuentes apropiadas, mientras que pango usa fontconfig (u otro backend de fuente compatible) para encontrar la fuente más apropiada basada en varias piezas lógicas en el propio pango y / o el backend.
fuente
Modifiqué el código para verificar si una fuente contiene todos los caracteres de una cadena determinada. Entonces esto puede ser llamado por
fc-search-codepoint "$fontname" "$string"
y devuelve el código de salida 0 en caso de éxito o 1 de lo contrario. Los nombres de las fuentes se pueden recuperar defc-query /path/to/FontSandMonoBoldOblique.ttf
o de Imagemagickconvert -list font
. Lo uso para verificar si una cadena seleccionada por el usuario se puede representar con la fuente seleccionada por el usuario y si el comando falla, se usa una fuente alternativa.fuente