テキストで欠落しているグリフを検出する


10

fortune画面上の通知に表示するために出力を呼び出してキャプチャするPython3 appindicatorを作成しました。

現在のフォントに対応するグリフが存在しない場合、一部のフォーチュンには16進数の正方形が含まれます。各四角は、不足しているグリフの16進Unicodeコードポイントを表しています。

ユーザーに表示する前に、16進テキストを削除したいのですが。私は、テキストを文字ごとに検査して、char.isValidCodePoint()類似または類似のものを判別できるいくつかのPython APIを見つけたいと思っていましたが、そのように見つけることはできません。

ここで調査したい解決策が見つかりましたがfonttools、ターミナルからインストールした後、Pythonプログラムをインポートできませんでしたfonttools/fontTools

任意のアイデア-Python APIを使用するか、ターミナルを呼び出すか?

アップデート#1:fonttools上記のリンクからのサンプルコードはPython2であるため機能しないことに気づきました。fonttoolsどういうわけか使用できたら、Python3スクリプトからPython2インタープリターを呼び出すことができると思います。

更新#2:たくさん読んだ後(下記の参考文献を参照)、私はそれ以降見つけましたfc-matchが、使用中のフォントを常に一意に特定できるわけではありません。Pythonで現在のフォントを取得します。

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

結果としてUbuntu 11。この結果をpango-view16進文字とともに渡すと、を含むフォントのリストが表示されますUbuntu。グリフがフォントによってレンダリングされなかった場合、私の考えでは、フォントはpango-view!の結果に表示されるべきではありません。

参照:

回答:


0

これは、これを使用していたところとは異なるアプローチですが、おそらく、Python str.replace()またはre.sub()メソッドを使用して、テキスト本文から16進数の文字列を解析できます。つまり:

ヘクスが予測可能な場合:

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

または、16進文字を正規表現と照合する必要がある場合:

import re

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

この戦略のより良い議論


別のオプションを指定してもかまいませんが、1)短いサンプルコードを追加する2)提案された元のポストソリューションからの可能なPROとCONを説明することで、回答を大幅に改善できると思います。
lpanebr

1
私は元のソリューションを批判しようとしているわけではないので、PRO / CONの比較がここで役立つかどうかわかりません。ただし、回答に対する提案のためのコード例を追加しました。
クリストファーハンター

@ChristopherHunter:幸運から来るテキストはプレーンテキストであり、そのテキストがレンダリングされたときにのみ16進数が表示されます(そして、それは私があなたの提案どおりにキャッチして処理するには遅すぎます)。
ベルンマイスター2017

0

Unicodeシェーピングエンジン

HarfbuzzのようなUnicodeシェーピングエンジンを使用して、欠けているグリフを検出します。これが実際の例です:

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にも同様の機能があるのは確かですが、Pangoはすでに低レベルでHarfbuzzを使用するように切り替えています。ただし、そのようなlibを使用した経験はありません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.