Detectar glifos ausentes no texto

9

Eu escrevi um appindicator Python3 que chama fortune e captura a saída para exibição na notificação na tela.

Algumas fortunas contêm quadrados com um número hexadecimal quando o glifo correspondente não existe na fonte atual. Cada quadrado é a representação do ponto de código hexadecimal Unicode para o glifo ausente.

Eu quero remover o texto hexadecimal antes de exibir para o usuário. Eu estava esperando encontrar alguma API do Python que me permitisse inspecionar texto, caractere por caractere, para determinar algo como char.isValidCodePoint() ou similar, mas não consigo encontrá-lo.

Eu encontrei uma possível solução que eu queria investigar aqui mas depois de instalar o fonttools via terminal, meu Python o programa não pôde importar fonttools/fontTools .

Alguma idéia - usando a API do Python ou chamando um terminal?

Atualização 1: Desde então, percebi que o código de amostra fonttools do link acima não funciona para mim, pois é o Python2. Eu suponho que se fonttools pudesse de alguma forma ser usado, eu poderia invocar um interpretador Python2 do meu script Python3.

Atualização # 2: Depois de ler muito (veja as referências abaixo), eu encontrei fc-match mas ele não pode sempre identificar a fonte em uso. Eu obtenho a fonte atual em Python:

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

resultando em Ubuntu 11 . Passando esse resultado para pango-view junto com o caractere hexadecimal, recebo uma lista de fontes incluindo Ubuntu . Ao pensar que o glifo não foi renderizado pela fonte, a fonte não deve aparecer no resultado de pango-view !

Referências:

por Bernmeister 20.09.2016 / 02:38

1 resposta

0

Esta é uma abordagem diferente de onde você estava indo com isso, mas talvez você pudesse usar apenas os métodos str.replace() ou re.sub() do python para analisar as sequências hexadecimais do corpo do texto. ou seja:

Se o hexadecimal for previsível:

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

Ou se você precisar corresponder qualquer caractere hexadecimal com uma expressão regular:

import re

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

Mais boas discussões sobre essa estratégia

    
por Christopher Hunter 10.11.2017 / 19:03

Tags