Como encontrar a fonte apropriada para renderizar pontos de código unicode?
gnome-terminal
descobrimos que caracteres como «🉃 ⼼ 😻🕲🝤» podem ser renderizados com fontes como Symbola, em vez da fonte do meu terminal ou do fallback do ponto de código no quadrado (????). Como ?
Respostas:
Este não é necessariamente o melhor método, e com certeza não é fácil de usar, mas é fácil começar a trabalhar: aqui está um script Python para fazer isso.
Instale a biblioteca Python-fontconfig . Você pode obtê-lo da sua distribuição (por exemplo,
sudo apt-get install python-fontconfig
no Debian e derivados) ou instalá-lo em seu diretório pessoal (pip install --user python-fontconfig)
. Então você pode executar este script (salve-o comofc-search-codepoint
em um diretório em seuPATH
, por exemplo~/bin
, tipicamente , e torne-o executável):Exemplo de uso:
Eu não tenho nenhuma fonte com todos esses caracteres.
fonte
#!/usr/bin/env python
que#!/usr/bin/env python2
de acordo com PEP 394.python3
; Acabei de escrever uma versão menor disso na parte inferior desta resposta .Usando fontconfig,
por exemplo
exibirá qualquer nome de arquivo de fonte contendo ✓ e ✗.
Para obter o ponto de código correspondente ao caractere, use (por exemplo)
Isso usa um recurso um tanto obscuro do utilitário POSIX
printf
:Tomados em conjunto,
Isso usa o
xargs
-I
sinalizador para substituir{}
por nomes destdin
. Portanto, isso se resume a:fonte
fontconfig
disso2.11.91
ou posterior .printf
e/bin/printf
apoio não faça issofc-list --format='%{postscriptname}\n' ':charset=2500-257F'
Por fim, o gnome-terminal usa o fontconfig para (entre outras coisas):
Na documentação da API, você pode encontrar funções para consultar intervalos de caracteres de fontes e para operações em intervalos de caracteres, mas a documentação é tão enigmática que eu nunca consegui descobrir como diferentes conjuntos de funções se relacionam. Se eu precisasse me aprofundar, preferiria ver exemplos de uso em outro software, talvez o vte (a biblioteca de emulação de terminal usada no gnome-terminal).
Outra biblioteca entre vte e fontconfig é o pango "... uma biblioteca para disposição e renderização de texto, com ênfase na internacionalização ..." . Agora que penso nisso, soa como o único a conter a maior parte da lógica que você procura.
A funcionalidade de cobertura de caracteres no pango é implementada por mapas de cobertura ( "Muitas vezes é necessário no Pango determinar se uma fonte específica pode representar um caractere específico e também quão bem ele pode representar esse caractere. O PangoCoverage é uma estrutura de dados usada para representar essas informações. " ), mas provavelmente há detalhes mais complicados envolvidos na decisão de qual glifo renderizar com qual fonte. Eu acho que o VTE depende do pango para processar seqüências de caracteres com fontes apropriadas, enquanto o pango usa fontconfig (ou outro back-end de fonte suportado) para encontrar a fonte mais apropriada com base em várias partes da lógica no próprio pango e / ou no back-end.
fonte
Alterei o código para verificar se uma fonte contém todos os caracteres de uma determinada string. Portanto, isso pode ser chamado
fc-search-codepoint "$fontname" "$string"
e retorna o código de saída 0 em caso de sucesso ou 1 em caso contrário. Os nomes das fontes podem ser recuperadosfc-query /path/to/FontSandMonoBoldOblique.ttf
ou do Imagemagickconvert -list font
. Eu o uso para verificar se uma sequência selecionada pelo usuário pode ser renderizada com a fonte selecionada pelo usuário e se o comando falhar, uma fonte alternativa será usada.fonte