Metinde eksik glifleri algılama


10

fortuneEkrandaki bildirimde görüntülenen çıkışı çağıran ve yakalayan bir Python3 appindicator yazdım .

Geçerli yazı tipinde karşılık gelen glif olmadığında, bazı talihler onaltılı sayıya sahip kareler içerir. Her kare, eksik glif için onaltılık Unicode kod noktasının temsilidir.

Kullanıcıya göstermeden önce onaltılık metni kaldırmak istiyorum. Ben char.isValidCodePoint()benzer veya benzer bir şey belirlemek için metin, karakter karakter, incelemek için izin verecek bazı Python API bulmayı umuyordum ama böyle bulamıyorum.

Burada araştırmak istediğim olası bir çözüm buldum, ancak fonttoolsterminal üzerinden kurduktan sonra Python programım içe aktarılamadı fonttools/fontTools.

Herhangi bir fikir - Python API kullanarak veya bir terminale çağırıyor?

Güncelleme # 1: O zamandan beri fonttoolsyukarıdaki bağlantıdan örnek kodun Python2 olduğu için benim için çalışmayacağını fark ettim. Bir fonttoolsşekilde kullanılabilseydi, Python3 betiğimden bir Python2 yorumlayıcısı çağırabilirim.

Güncelleme # 2: Çok sayıda okumadan sonra (aşağıdaki referanslara bakın), o zamandan beri buldum fc-matchancak kullanılan yazı tipini her zaman benzersiz bir şekilde tanımlayamıyor. Geçerli yazı tipini Python elde:

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

ile sonuçlanır Ubuntu 11. Bu sonucu pango-viewonaltılık karakterle birlikte geçirerek, dahil yazı tiplerinin bir listesini alıyorum Ubuntu. Glif, yazı tipi tarafından oluşturulmamışsa, yazı tipinin sonuçta görünmemesi gerektiğini düşünüyorum pango-view.

Referanslar:

Yanıtlar:


0

Bu, bununla gittiğiniz yerden farklı bir yaklaşımdır, ancak belki de metin gövdesinizden onaltılık dizeleri ayrıştırmak için python'ları str.replace()veya re.sub()yöntemleri kullanabilirsiniz. yani:

Onaltılık öngörülebilirse:

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

Veya herhangi bir onaltılı karakteri normal bir ifadeyle eşleştirmeniz gerekiyorsa:

import re

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

Bu stratejinin daha iyi tartışılması


Alternatif seçenekler vermek sorun değil ama 1) kısa örnek kod ekleyerek cevabınızı çok geliştirebileceğinizi düşünüyorum 2) orijinal post önerilen çözüm ve sizin olası PRO ve CON açıklayan.
lpanebr

1
Orijinal çözümü eleştirmeye çalışmıyorum, bu yüzden bir PRO / CON karşılaştırmasının burada yardımcı olup olmayacağını bilmiyorum. Ancak, cevap için önerilerim için kod örnekleri ekledim.
Christopher Hunter

@ChristopherHunter: Servetten gelen metin düz metindir ve yalnızca bu metin oluşturulduğunda onaltılık görünür (ve önerdiğim gibi yakalayıp işlemek için çok geç).
Bernmeister

0

Unicode şekillendirme motoru

Eksik glifi tespit etmek için Harfbuzz gibi bir Unicode şekillendirme motoru kullanın. İşte çalışan bir örnek:

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'])

Çıktı

registered
.notdef

Burada IDLE3'teki çıkış kontrol edilirken:

>>> 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}]

Doğru yazı tipi yolunu kontrol edin, şu anki makinemde gördüğüm ilk yolu seçtim.

Not:

  • Gtk / Pango'nun benzer bir işleve sahip olduğundan eminim, Pango zaten Harfbuzz'ı düşük seviyede kullanmaya başladı. Ancak, böyle bir lib kullanma deneyimim yok.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.