पाठ में लापता ग्लिफ़ का पता लगाएं


10

मैंने Python3 एपिंडिलेटर लिखा है जो fortuneऑन-स्क्रीन नोटिफिकेशन में डिस्प्ले के लिए आउटपुट को कॉल और कैप्चर करता है।

कुछ फॉक्सेक्स में हेक्साडेसिमल संख्या के साथ वर्ग होते हैं जब संबंधित ग्लिफ़ वर्तमान फ़ॉन्ट में मौजूद नहीं होता है। प्रत्येक वर्ग लापता ग्लिफ़ के लिए हेक्साडेसिमल यूनिकोड कोड बिंदु का प्रतिनिधित्व करता है।

मैं उपयोगकर्ता को प्रदर्शित करने से पहले हेक्साडेसिमल पाठ को निकालना चाहता हूं। मैं कुछ पायथन एपीआई को खोजने की उम्मीद कर रहा था जो मुझे पाठ, चरित्र द्वारा चरित्र का निरीक्षण करने देगा, जैसे कुछ char.isValidCodePoint()या समान निर्धारित करने के लिए, लेकिन मुझे ऐसा नहीं मिल सकता है।

मुझे एक संभावित समाधान मिला जिसे मैं यहाँ जाँच करना चाहता था लेकिन fonttoolsटर्मिनल के माध्यम से स्थापित करने के बाद , मेरा पायथन कार्यक्रम आयात नहीं कर सका fonttools/fontTools

किसी भी विचार - या तो पायथन एपीआई का उपयोग करना या टर्मिनल पर कॉल करना?

अपडेट # 1: जब से मुझे पता चला है कि fonttoolsऊपर दिए गए लिंक से नमूना कोड मेरे लिए काम नहीं करेगा क्योंकि यह Python2 है। मुझे लगता है कि अगर fonttoolsकिसी तरह इस्तेमाल किया जा सकता है, तो मैं अपनी पायथन 3 स्क्रिप्ट से Python2 दुभाषिया को आमंत्रित कर सकता हूं।

अद्यतन # 2: बहुत पढ़ने के बाद (नीचे संदर्भ देखें), मैंने पाया है fc-matchलेकिन यह हमेशा उपयोग में फ़ॉन्ट की विशिष्ट पहचान नहीं कर सकता है । मैं पायथन में वर्तमान फ़ॉन्ट प्राप्त करता हूं:

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

जिसके परिणामस्वरूप Ubuntu 11। इस परिणाम को pango-viewहेक्साडेसिमल चरित्र के साथ पास करते हुए, मुझे फोंट की एक सूची मिल जाती है Ubuntu। मेरे विचार से अगर ग्लिफ़ को फ़ॉन्ट द्वारा प्रस्तुत नहीं किया गया था, तो फ़ॉन्ट परिणाम से प्रकट नहीं होना चाहिए pango-view!

संदर्भ:

जवाबों:


0

यह एक अलग दृष्टिकोण है जहां से आप इसके साथ जा रहे थे, लेकिन शायद आप अपने पाठ शरीर से हेक्सिडेसिमल स्ट्रिंग्स को पार्स करने के लिए सिर्फ पायथन str.replace()या re.sub()विधियों का उपयोग कर सकते हैं । अर्थात:

यदि हेक्स अनुमानित है:

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

या यदि आपको नियमित अभिव्यक्ति के साथ किसी भी हेक्स वर्ण का मिलान करने की आवश्यकता है:

import re

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

इस रणनीति की अधिक अच्छी चर्चा


यह वैकल्पिक विकल्प देने के लिए ठीक है, लेकिन मुझे लगता है कि आप अपने उत्तर में 1 से बहुत सुधार कर सकते हैं) शॉर्ट सैंपल कोड 2 जोड़कर) मूल पोस्ट प्रस्तावित समाधान और तुम्हारा से संभावित पीआरओ और कॉन्स का वर्णन करते हुए।
18

1
मैं मूल समाधान की आलोचना करने का प्रयास नहीं कर रहा हूं, इसलिए मुझे नहीं पता कि क्या प्रो / कांग्रेस की तुलना यहां मददगार होगी। हालाँकि, मैंने अपने सुझावों के उत्तर के लिए कोड उदाहरण जोड़े हैं।
क्रिस्टोफर हंटर

@ChristopherHunter: जो पाठ भाग्य से आता है वह सादा पाठ होता है और यह केवल तब होता है जब उस पाठ का प्रतिपादन किया जाता है, हेक्साडेसिमल दिखाई देता है (और आपको सुझाव देते हुए मुझे पकड़ने और संसाधित करने में बहुत देर हो जाती है)।
बर्नमेस्टर

0

यूनिकोड आकार देने वाला इंजन

लापता ग्लिफ़ का पता लगाने के लिए हार्फ़बज़ जैसे यूनिकोड आकार देने वाले इंजन का उपयोग करें। यहाँ एक काम कर उदाहरण है:

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

उत्पादन

registered
.notdef

यहाँ जाँच करते समय IDLE3 में आउटपुट:

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

सही फ़ॉन्ट पथ के लिए जाँच करें, मैंने अभी-अभी अपनी वर्तमान मशीन में पहली बार देखा था।

ध्यान दें:

  • मुझे यकीन है कि Gtk / Pango का कार्य समान है, पंगो ने पहले से ही निम्न स्तर पर हार्फबज का उपयोग करने के लिए स्विच किया है। हालाँकि, मेरे पास इस तरह के काम का उपयोग करने का अनुभव नहीं है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.