Mendeteksi mesin terbang yang hilang dalam teks

10

Saya telah menulis appindicator Python3 yang memanggil fortunedan menangkap output untuk ditampilkan di notifikasi di layar.

Beberapa kekayaan berisi kotak dengan angka heksadesimal saat mesin terbang yang sesuai tidak ada di font saat ini. Setiap kotak adalah representasi dari titik kode Unicode heksadesimal untuk mesin terbang yang hilang.

Saya ingin menghapus teks heksadesimal sebelum saya tampilkan kepada pengguna. Saya berharap untuk menemukan beberapa API Python yang akan membiarkan saya memeriksa teks, karakter demi karakter, untuk menentukan sesuatu seperti char.isValidCodePoint()atau serupa tetapi saya tidak dapat menemukannya.

Saya menemukan solusi yang mungkin ingin saya selidiki di sini tetapi setelah menginstal fonttoolsmelalui terminal, program Python saya tidak dapat mengimpor fonttools/fontTools.

Ada ide - baik menggunakan API Python atau memanggil ke terminal?

Pembaruan # 1: Sejak itu saya menyadari fonttoolskode sampel dari tautan di atas tidak akan berfungsi untuk saya karena itu adalah Python2. Saya kira jika fonttoolsentah bagaimana bisa digunakan, saya bisa memanggil juru bahasa Python2 dari skrip Python3 saya.

Pembaruan # 2: Setelah banyak membaca (lihat referensi di bawah), saya telah menemukan fc-matchtetapi tidak selalu dapat mengidentifikasi secara unik font yang digunakan. Saya mendapatkan font saat ini dalam Python:

from gi.repository import Gio
fontName = Gio.Settings( "org.gnome.desktop.interface" ).get_string( "font-name" )

menghasilkan Ubuntu 11. Melewati hasil ini pango-viewbersamaan dengan karakter heksadesimal, saya mendapatkan daftar font termasuk Ubuntu. Menurut saya jika mesin terbang TIDAK diterjemahkan oleh font, font tersebut seharusnya tidak muncul dalam hasil dari pango-view!

Referensi:

Bernmeister
sumber

Jawaban:

0

Ini adalah pendekatan yang berbeda dari tujuan Anda menggunakan ini, tetapi mungkin Anda bisa menggunakan python str.replace()atau re.sub()metode untuk mengurai string hexidecimal dari badan teks Anda. yaitu:

Jika hex dapat diprediksi:

originalText = "\xc3\xa5Test"
filteredText = originalText.replace("\xc3\xa5", "")

Atau jika Anda harus mencocokkan karakter hex dengan ekspresi reguler:

import re

originalText = "\xc3\xa5Test"
filteredText = re.sub(r'[^\x00-\x7f]', r'', originalText)

Diskusi yang lebih baik dari strategi ini

Christopher Hunter
sumber
Tidak apa-apa untuk memberikan opsi alternatif tetapi saya pikir Anda dapat meningkatkan jawaban Anda banyak dengan 1) menambahkan kode sampel pendek 2) menggambarkan kemungkinan PRO dan KON dari solusi pos yang diusulkan asli dan Anda.
lpanebr
1
Saya tidak mencoba untuk mengkritik solusi asli jadi saya tidak tahu apakah perbandingan PRO / CON akan membantu di sini. Namun, saya menambahkan contoh kode untuk saran saya sebagai jawaban.
Christopher Hunter
@ChristopherHunter: Teks yang berasal dari rejeki adalah teks biasa dan hanya ketika teks tersebut diterjemahkan muncul heksadesimal (dan itu sudah terlambat bagi saya untuk menangkap dan memproses seperti yang Anda sarankan).
Bernmeister
0

Mesin pembuat Unicode

Gunakan mesin pembuat Unicode seperti Harfbuzz untuk mendeteksi mesin terbang yang hilang. Berikut ini contoh kerjanya:

from pyharfbuzz import shape
f = "/usr/local/lib/python3.6/site-packages/werkzeug/debug/shared/ubuntu.ttf"
t = "®"
s = shape(f, t)
print(s[1]['glyph_name'])
t = "რ"
s = shape(f, t)
print(s[1]['glyph_name'])

Keluaran

registered
.notdef

Di sini output di IDLE3 saat memeriksa:

>>> t = "®"
>>> s = shape(f, t)
>>> s
[{'cluster': 0, 'glyph_name': 'registered', 'x_advance': 29.453125, 'y_advance': 0.0, 'x_offset': 0.0, 'y_offset': 0.0}]
>>> t = "რ"
>>> s = shape(f, t)
>>> s
[{'cluster': 0, 'glyph_name': '.notdef', 'x_advance': 36.0, 'y_advance': 0.0, 'x_offset': 0.0, 'y_offset': 0.0}]

Periksa jalur font yang benar, saya hanya memilih yang pertama saya lihat di mesin saya saat ini.

catatan:

  • Aku diam yakin Gtk / Pango memiliki fungsi serupa, Pango sudah beralih menggunakan Harfbuzz di level rendah. Namun, saya tidak punya pengalaman menggunakan Lib seperti itu.
user.dz
sumber