Bagaimana menemukan font yang sesuai untuk rendering codepoint unicode?
gnome-terminal
menemukan bahwa karakter seperti Β«π βΌΌ π»π²π€Β» dapat diterjemahkan dengan font seperti Symbola daripada font terminal saya atau fallback codepoint-in-square (????). Bagaimana?
Jawaban:
Ini belum tentu metode terbaik, dan tentu saja tidak ramah pengguna, tetapi mudah untuk bekerja: inilah skrip Python untuk melakukannya.
Instal pustaka Python-fontconfig . Baik mendapatkannya dari distribusi Anda (misalnya
sudo apt-get install python-fontconfig
pada Debian dan turunannya) atau menginstalnya di direktori home Anda (pip install --user python-fontconfig)
. Kemudian Anda dapat menjalankan skrip ini (simpan sebagaifc-search-codepoint
dalam direktori pada AndaPATH
, mis. Biasanya~/bin
, dan membuatnya dapat dieksekusi):Contoh penggunaan:
Saya tidak memiliki font apa pun dengan semua karakter ini.
sumber
#!/usr/bin/env python
untuk#!/usr/bin/env python2
sesuai PEP 394.python3
juga; Saya baru saja menulis versi yang lebih kecil di bagian bawah jawaban ini .Menggunakan fontconfig,
misalnya
akan menampilkan semua nama file font yang mengandung β dan β.
Untuk mendapatkan codepoint yang sesuai dengan penggunaan karakter (misalnya)
Ini menggunakan fitur agak jelas dari POSIX
printf
utilitas :Diambil bersama-sama,
Ini menggunakan
xargs
-I
bendera untuk menggantikan{}
nama daristdin
. Jadi ini secara efektif bermuara pada:sumber
fontconfig
itu2.11.91
atau yang lebih baru .printf
dan/bin/printf
jangan mendukungnyafc-list --format='%{postscriptname}\n' ':charset=2500-257F'
Akhirnya gnome-terminal menggunakan fontconfig untuk (antara lain):
Dalam dokumentasi API Anda dapat menemukan fungsi untuk menanyakan rentang karakter font dan untuk operasi pada rentang karakter, tetapi dokumentasinya sangat samar sehingga saya tidak pernah bisa mengetahui bagaimana rangkaian fungsi yang berbeda saling berhubungan. Jika saya perlu menyelam lebih dalam, saya lebih suka melihat contoh penggunaan dalam perangkat lunak lain, mungkin vte (perpustakaan emulasi terminal yang digunakan di gnome-terminal).
Perpustakaan lain di antara vte dan fontconfig adalah pango "... perpustakaan untuk meletakkan dan rendering teks, dengan penekanan pada internasionalisasi ..." . Sekarang saya memikirkannya, itu terdengar sebagai yang mengandung sebagian besar logika yang Anda cari.
Fungsi cakupan karakter dalam pango diimplementasikan oleh peta cakupan ( "Sering kali perlu di Pango untuk menentukan apakah font tertentu dapat mewakili karakter tertentu, dan juga seberapa baik itu dapat mewakili karakter itu. PangoCoverage adalah struktur data yang digunakan untuk merepresentasikan informasi itu. " ), tetapi mungkin ada detail yang lebih rumit yang terlibat dalam memutuskan mesin terbang apa yang harus dirender dengan font apa. Saya kira VTE bergantung pada pango untuk membuat string dengan font yang sesuai sementara pango menggunakan fontconfig (atau backend font yang didukung lainnya) untuk menemukan font yang paling tepat berdasarkan berbagai potongan logika dalam pango itu sendiri dan / atau backend.
sumber
Saya mengubah kode untuk memeriksa apakah font berisi semua karakter dari string tertentu. Jadi ini bisa dipanggil oleh
fc-search-codepoint "$fontname" "$string"
dan mengembalikan kode keluar 0 jika berhasil atau 1 sebaliknya. Nama font dapat diambil darifc-query /path/to/FontSandMonoBoldOblique.ttf
atau Imagemagickconvert -list font
. Saya menggunakannya untuk memeriksa apakah string yang dipilih pengguna dapat dirender dengan font yang dipilih pengguna dan jika perintah gagal, font fallback digunakan.sumber