텍스트에서 누락 된 글리프 감지


10

fortune화면 알림에 표시하기 위해 출력을 호출 하고 캡처 하는 Python3 appindicator를 작성했습니다 .

현재 글꼴에 해당 글리프가없는 경우 일부 운에는 16 진수로 된 사각형이 포함됩니다. 각 사각형은 누락 된 글리프에 대한 16 진수 유니 코드 코드 포인트를 나타냅니다.

사용자에게 표시하기 전에 16 진 텍스트를 제거하고 싶습니다. 문자별로 문자를 검사하여 비슷 char.isValidCodePoint()하거나 비슷한 것을 결정할 수있는 Python API를 찾고 있었지만 찾을 수는 없었습니다.

여기 에서 조사하고 싶은 가능한 해결책을 찾았 지만 fonttools터미널을 통해 설치 한 후 Python 프로그램을 가져올 수 없습니다 fonttools/fontTools.

파이썬 API를 사용하거나 터미널을 호출하는 아이디어가 있습니까?

업데이트 # 1 : 이후 fonttoolsPython2이므로 위 링크 의 샘플 코드가 작동하지 않는다는 것을 깨달았습니다 . fonttools어떻게 든 사용할 수 있다면 Python3 스크립트에서 Python2 인터프리터를 호출 할 수 있다고 가정합니다 .

업데이트 # 2 : 많은 독서 후 (아래 참조 참조) 이후 발견 fc-match했지만 사용중인 글꼴을 항상 고유하게 식별 할 수는 없습니다 . 파이썬에서 현재 글꼴을 얻습니다.

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

결과 Ubuntu 11. 이 결과를 pango-view16 진수 문자와 함께 전달하면을 포함한 글꼴 목록이 나타납니다 Ubuntu. 글꼴에 의해 글리프가 렌더링되지 않았다면 내 생각에 글꼴이 나타나지 않아야합니다 pango-view!

참고 문헌 :

답변:


0

이것은 당신이 이것과 함께하는 것과 다른 접근법이지만, 아마도 파이썬 str.replace()이나 re.sub()메소드를 사용 하여 텍스트 본문에서 16 진수 문자열을 파싱 할 수 있습니다 . 즉 :

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) 원래 제안 된 솔루션 및 솔루션에서 가능한 찬반 양론을 설명하여 답변을 크게 향상시킬 수 있다고 생각합니다.
lpanebr

1
원래 솔루션을 비판하려고하지 않으므로 여기에서 PRO / CON 비교가 도움이 될지 모르겠습니다. 그러나 답변에 대한 제안에 대한 코드 예제를 추가했습니다.
Christopher Hunter

@ChristopherHunter : 운에서 나오는 텍스트는 일반 텍스트이며 텍스트가 렌더링 될 때만 16 진수가 나타납니다 (그리고 제안한대로 잡아서 처리하기에는 너무 늦습니다).
Bernmeister

0

유니 코드 쉐이핑 엔진

그림 문자 누락을 감지하려면 Harfbuzz와 같은 유니 코드 쉐이핑 엔진을 사용하십시오. 다음은 실제 예입니다.

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를 사용하도록 전환했습니다. 그러나 그러한 라이브러리를 사용한 경험이 없습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.