我编写了一个 Python3 appindicator,它调用fortune
并捕获输出以在屏幕通知中显示。
当当前字体中不存在相应的字形时,某些命运包含带有十六进制数字的正方形。每个方块都是丢失字形的十六进制 Unicode 代码点的表示。
我想在向用户显示之前删除十六进制文本。我希望找到一些 Python 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
!
参考:
这是与您使用此方法不同的方法,但也许您可以使用 python
str.replace()
或re.sub()
方法从文本正文中解析出十六进制字符串。IE:如果十六进制是可预测的:
或者,如果您需要使用正则表达式匹配任何十六进制字符:
更多关于这个策略的讨论
Unicode 整形引擎
使用像 Harfbuzz 这样的 Unicode 整形引擎来检测丢失的字形。这是一个工作示例:
输出
检查时 IDLE3 中的输出如下:
检查正确的字体路径,我刚刚选择了我在当前机器上看到的第一个。
笔记:
已经想出了一个解决方案...最初我认为财富文本文件不包含十六进制字符。事实证明这是不正确的。因此,一旦我意识到这一点,我就想出了以下解决方案: