Обнаружьте недостающие глифы в тексте

Я записал Python3 appindicator, который звонит fortune и получает вывод для дисплея в экранном уведомлении.

Некоторые состояния содержат квадраты с шестнадцатеричным числом, когда соответствующий глиф не существует в текущем шрифте. Каждый квадрат является представлением шестнадцатеричной кодовой точки Unicode для недостающего глифа.

Я хочу удалить шестнадцатеричный текст, прежде чем я отображусь пользователю. Я надеялся найти некоторый Python API, который позволит мне осмотреть текст, символ символом, для определения чего-то как char.isValidCodePoint() или подобный, но я не могу найти как таковым.

Я нашел возможное решение, которое я хотел исследовать здесь, но после установки fonttools через терминал моя программа Python не могла импортировать fonttools/fontTools.

Какие-либо идеи - или использование API Python или обращение к терминалу?

Обновление № 1: Я с тех пор понял fonttools пример кода из ссылки выше не будет работать на меня, поскольку это - Python2. Я предполагаю если fonttools мог так или иначе использоваться, я мог вызвать интерпретатор Python2 из своего сценария Python3.

Обновление № 2: После большого чтения (см. ссылки ниже), я с тех пор нашел fc-match но это не может всегда однозначно определять используемый шрифт. Я получаю текущий шрифт в Python:

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

получающийся в Ubuntu 11. Передача этого результата к pango-view наряду с шестнадцатеричным символом, я получаю список шрифтов включая Ubuntu. К моим взглядам, если глиф НЕ был представлен шрифтом, шрифт не должен появляться в результате pango-view!

Ссылки:

10
задан 23 May 2017 в 05:39

3 ответа

Нашел решение... сначала я думал, что текстовые файлы состояния НЕ содержат шестнадцатеричных символов. Оказывается, это было неправильно. Итак, как только я понял это, я придумал следующее решение:

import codecs
fortune = <call the fortune program>
output = ""
for c in fortune:
    if codecs.encode( str.encode( c ), "hex" ) == b'07':
        continue

    output += c                   

print( output )
0
ответ дан 12 September 2020 в 05:03

Это - другой подход от того, куда Вы шли с этим, но возможно Вы могли просто использовать Python 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)

Более хорошее обсуждение этой стратегии

0
ответ дан 23 November 2019 в 04:42

Механизм формирования Unicode

Используйте механизм формирования Unicode как 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 на низком уровне. Однако у меня нет опыта с помощью такого lib.
0
ответ дан 23 November 2019 в 04:42

Другие вопросы по тегам:

Похожие вопросы: