Я записал 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
!
Ссылки:
Нашел решение... сначала я думал, что текстовые файлы состояния НЕ содержат шестнадцатеричных символов. Оказывается, это было неправильно. Итак, как только я понял это, я придумал следующее решение:
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 )
Это - другой подход от того, куда Вы шли с этим, но возможно Вы могли просто использовать 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)
Используйте механизм формирования 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}]
Проверьте на путь правильного шрифта, я просто выбрал первый, который я видел в своей текущей машине.
Примечание: