检测文本中缺少的字形


10

我编写了一个Python3应用程序,该调用程序fortune捕获并捕获输出以在屏幕通知中显示。

当当前字体中不存在相应的字形时,某些时运会包含带有十六进制数字的正方形。每个正方形代表缺失字形的十六进制Unicode代码点的表示形式。

我想在显示给用户之前删除十六进制文本。我希望找到一些Python API,该API可让我逐字符检查文本,以确定类似char.isValidCodePoint()或类似的内容,但我找不到类似的东西。

我在这里找到了一个可能要研究的解决方案,但是fonttools通过终端安装后,我的Python程序无法导入fonttools/fontTools

有什么想法-使用Python API还是调用终端?

更新#1:从那以后,我意识到fonttools上面链接中的示例代码对我不起作用,因为它是Python2。我想如果fonttools可以以某种方式使用它,我可以从我的Python3脚本中调用一个Python2解释器。

更新#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!的结果中

参考文献:

Answers:


0

这与您要使用的方法不同,但是也许您可以使用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)

关于此策略的更多讨论


可以选择其他方法,但我认为您可以通过以下方法大大改善您的答案:1)添加简短的示例代码2)描述原始提议的解决方案和您自己的解决方案的优点和缺点。
lpanebr '17

1
我不是要批评原始解决方案,所以我不知道PRO / CON比较在这里是否有帮助。但是,我已经为我的建议添加了代码示例。
Christopher Hunter

@ChristopherHunter:来自命运的文本是纯文本,只有在渲染该文本时才显示十六进制(对于我来说,按您的建议来抓取和处理该文本为时已晚)。
Bernmeister

0

Unicode整形引擎

使用Harfbuzz之类的Unicode整形引擎来检测丢失的字形。这是一个工作示例:

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的经验。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.