Jak znaleźć odpowiednią czcionkę do renderowania punktów kodowych Unicode?
gnome-terminal
okaże się, że znaki takie jak «🉃 ⼼ 😻🕲🝤» mogą być renderowane za pomocą czcionek takich jak Symbola, a nie czcionek terminalowych lub zastępczego kodu zastępczego w kwadracie (????). W jaki sposób ?
Odpowiedzi:
To niekoniecznie najlepsza metoda i na pewno nie jest przyjazna dla użytkownika, ale łatwo jest zacząć działać: oto skrypt Pythona, aby to zrobić.
Zainstaluj bibliotekę Python-fontconfig . Pobierz go ze swojej dystrybucji (np.
sudo apt-get install python-fontconfig
Na Debianie i jego pochodnych) lub zainstaluj w swoim katalogu domowym (pip install --user python-fontconfig)
. Następnie możesz uruchomić ten skrypt (zapisz go jakfc-search-codepoint
w katalogu na swoim komputerzePATH
, np. Zazwyczaj~/bin
i spraw , by był wykonywalny):Przykładowe użycie:
Nie mam żadnej czcionki dla wszystkich tych znaków.
źródło
#!/usr/bin/env python
się#!/usr/bin/env python2
zgodnie z PEP 394.python3
; Właśnie napisałem mniejszą wersję tego na dole tej odpowiedzi .Używając fontconfig,
na przykład
wyświetli nazwy plików czcionek zawierające ✓ i ✗.
Aby uzyskać punkt kodowy odpowiadający użyciu znaku (na przykład)
Ten wykorzystuje nieco niejasne funkcji z POSIX
printf
użyteczności :Razem wzięte,
Używa
xargs
-I
flagi do zastąpienia{}
nazwami zstdin
. Skutecznie sprowadza się to do:źródło
fontconfig
tego2.11.91
lub nowszej .printf
i/bin/printf
dont obsługują tofc-list --format='%{postscriptname}\n' ':charset=2500-257F'
Ostatecznie gnome-terminal używa fontconfig do (między innymi):
W dokumentacji API można znaleźć funkcje do wyszukiwania czcionek w zakresach znaków i operacji na zakresach znaków, ale dokumentacja jest tak tajemnicza, że nigdy nie mogłem zrozumieć, w jaki sposób różne zestawy funkcji odnoszą się do siebie. Gdybym musiał zanurkować głębiej, wolałbym spojrzeć na przykłady użycia w innym oprogramowaniu, być może vte (biblioteka emulacji terminala używana w gnome-terminal).
Kolejną biblioteką pomiędzy vte i fontconfig jest pango „… biblioteka do układania i renderowania tekstu, z naciskiem na internacjonalizację…” . Teraz, kiedy o tym myślę, wydaje się, że zawiera większość logiki, której szukasz.
Funkcjonalność pokrycia znaków w Pango jest implementowana przez mapy pokrycia ( „W Pango często konieczne jest ustalenie, czy określona czcionka może reprezentować określony znak, a także jak dobrze może reprezentować ten znak. PangoCoverage to używana struktura danych reprezentować tę informację. ” ), ale prawdopodobnie w bardziej skomplikowanych szczegółach decyduje, który glif ma być renderowany za pomocą jakiej czcionki. Wydaje mi się, że VTE korzysta z pango do renderowania ciągów z odpowiednimi czcionkami, podczas gdy pango używa fontconfig (lub innego obsługiwanego backendu czcionek), aby znaleźć najbardziej odpowiednią czcionkę opartą na różnych elementach logicznych w samym pango i / lub backendie .
źródło
Zmieniłem kod, aby sprawdzić, czy czcionka zawiera wszystkie znaki określonego ciągu. Może to być wywołane przez
fc-search-codepoint "$fontname" "$string"
i zwraca kod zakończenia 0 w przypadku powodzenia lub 1 w przeciwnym razie. Nazwy czcionek można pobrać zfc-query /path/to/FontSandMonoBoldOblique.ttf
lub Imagemagickconvert -list font
. Używam go, aby sprawdzić, czy ciąg wybrany przez użytkownika może być renderowany za pomocą czcionki wybranej przez użytkownika, a jeśli polecenie się nie powiedzie, używana jest czcionka zastępcza.źródło