Python Unicode 渲染:如何确定字体中是否缺少 Unicode 字符

12
在Python中,当我用选定的字体呈现一个Unicode字符(例如汉字)时,有时由于常见的Unicode字符不完整,无法呈现所需的Unicode字符。在这种情况下,如果我调用“print”函数,输出通常只是一个方框,而不管底层的Unicode字符实际上应该看起来像什么。
当然,一旦我打印出Unicode字符,我可以查看输出,然后确定所选字体是否缺少特定的Unicode字符。但是,是否有一种方法可以在打印之前自动告诉我,而无需依靠我自己的人眼来确定字符是否包含在字体中?
我还要澄清一点,我知道有些字体比其他字体更完整。我的问题不是我可以使用哪个字体,以便在调用“print”时通常会得到合理的输出。请忽略如何打印字符或是否实际上要打印字符的问题。我的问题只是,针对任何给定的字体,如何判断Unicode字符是否缺失,而不使用任何依赖于人类判断输出的手动过程。

操作系统可能会有所不同,你使用的是哪一个? - Mark Ransom
1
当调用print时,您如何知道使用的是哪种字体?stdout上的文本可能会传输到终端、文件或其他应用程序...简而言之,如果没有更多的限制条件,这个问题是无法回答的。 - gz.
你询问了关于渲染的问题,但却拒绝了渲染,所以你的问题实际上只是“如何在Python中测试字体数据中的未定义字符?”。那么要测试哪些字体数据呢? - handle
1
“控制台使用哪种字体”或“确定print是否输出到控制台”可能是另外两个问题(或许已经被问过)。我认为这个问题的措辞已经很好了,只需要包含操作系统的细节即可。如果您要留下答案,也许可以考虑这些其他方面,以使答案更完整。 - Mark Ransom
@handle 任何字体数据... 这就是我的问题所在。 - MichM
显示剩余3条评论
1个回答

17

请查看此网页

简而言之,您可以安装fonttools软件包,提供感兴趣的.ttf字体文件的路径,并检查所需Unicode字符的长格式是否包含在字体文件的Unicode映射表中。

from fontTools.ttLib import TTFont
font = TTFont(fontpath)   # specify the path to the font in question


def char_in_font(unicode_char, font):
    for cmap in font['cmap'].tables:
        if cmap.isUnicode():
            if ord(unicode_char) in cmap.cmap:
                return True
    return False

然后只需调用char_in_font函数来检查Unicode字符是否包含在字体中。


通常情况下,我会对仅包含链接的回答提出抱怨,但在这种情况下,这是指向另一个 StackExchange 站点的链接...而且您还提供了摘要。 - Mark Ransom
3
那么根据你的描述,@MarkRansom 发布的内容并不是仅包含链接的。 - MichM
1
是和否 - 仅凭摘要本身并不足以编写解决方案。顺便说一句,恭喜你找到答案并回来告诉我们,你可能会在某一天拯救某个人的生命。 - Mark Ransom
好的,谢谢。实际上代码很简单,但我已经添加了它。 - MichM
1
FontTools支持其他格式。 - handle
这对我没用:char_in_font('햱','/usr/share/fonts/truetype/hack/Hack-Regular.ttf')返回False,但在我的终端中使用该字体时它显示出来了。(Python 3.7.3 on Debian buster) - Brian Minton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接