Виявити відсутні тексти в тексті


10

Я написав додаток Python3, який викликає fortuneта фіксує вихід для відображення в екрані сповіщення.

Деякі статки містять квадрати з шістнадцятковим числом, коли відповідний гліф не існує у поточному шрифті. Кожен квадрат є поданням шістнадцяткової кодової точки Unicode для відсутнього гліфа.

Я хочу видалити шістнадцятковий текст перед тим, як показувати користувачеві. Я сподівався знайти якийсь API Python, який дозволить мені перевірити текст, символ за символом, щоб визначити щось подібне 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!

Список літератури:

Відповіді:


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) опису можливих ПРО та ЗНО від оригінального запропонованого рішення та вашої проблеми.
lpanebr

1
Я не намагаюся критикувати оригінальне рішення, тому не знаю, чи порівняння PRO / CON буде тут корисним. Однак я додав приклади коду для своїх пропозицій у відповідь.
Крістофер Хантер

@ChristopherHunter: Текст, який походить від фортуни, є простим текстом, і лише тоді, коли цей текст виведений, з’являється шістнадцятковий (і це вже пізно, щоб я захоплював та обробляв, як ви пропонуєте).
Бернмайстер

0

Двигун, що формує 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 на низькому рівні. Однак я не маю досвіду використання таких ліб.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.