python unicode渲染:如何知道字体中是不是缺少unicode字符

Posted

技术标签:

【中文标题】python unicode渲染:如何知道字体中是不是缺少unicode字符【英文标题】:python unicode rendering: how to know if a unicode character is missing from the fontpython unicode渲染:如何知道字体中是否缺少unicode字符 【发布时间】:2017-10-05 16:07:34 【问题描述】:

在 Python 中,当我渲染一个 unicode 字符时,例如一个汉字,用一个选定的字体,有时字体对于常见的unicode字符来说是不完整的,并且无法渲染有问题的unicode字符。在这些情况下,如果我调用“打印”函数,输出通常看起来就像一个方框,而不管底层的 unicode 字符应该是什么样子。

当然,一旦我打印了 unicode 字符,我就可以查看输出,然后确定所选字体错过了特定的 unicode 字符。但是有没有办法在我打印之前自动判断,而不必依靠我自己的肉眼来确定字体中是否包含字符?

我还要澄清一下,我知道的字体比其他字体更完整。我的问题不是我可以使用哪种字体,所以如果我调用“打印”,我通常会有一个合理的输出。也请忽略我如何打印字符或我是否真的想打印字符的问题。我的问题很简单,对于任何给定的字体,我如何判断字体中是否缺少 unicode 字符,而不使用任何依赖人工判断输出的手动过程。

【问题讨论】:

操作系统可能会有所不同,您使用的是哪一个? 你怎么知道调用 print 时使用的是什么字体?标准输出上的文本可能会发送到终端、文件、其他应用程序……简而言之,如果没有更多限制,这个问题是无法回答的。 我认为你们都没有理解我的意思。不管我是否或如何打印字符,我只想知道一个字符是否包含在字体中。 您询问渲染,但拒绝渲染,所以您的问题实际上不只是“如何在 Python 中测试未定义字符的字体数据?”。 哪些字体数据? @gz。 “控制台使用哪种字体”或“确定print 是否要控制台”将是可能(或可能已经)提出的两个附加问题。我认为这个问题的措辞本身就很好,只要包括哪个操作系统的细节。如果您要留下答案,也许可以解决这些其他考虑因素以使答案更完整。 【参考方案1】:

见https://unix.stackexchange.com/questions/247108/how-to-find-out-which-unicode-codepoints-are-defined-in-a-ttf-file

简而言之,可以安装 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 站点的链接......并且您提供了摘要。 @MarkRansom 那么根据您的描述,它不是仅链接;) 是和否 - 摘要本身并不足以编写解决方案。附言恭喜您找到答案并回来通知我们其他人,您可能有一天会拯救某人的培根。 好的,谢谢。代码其实很简单,不过我加了。 FontTools 支持其他格式。

以上是关于python unicode渲染:如何知道字体中是不是缺少unicode字符的主要内容,如果未能解决你的问题,请参考以下文章

如何将ethiopic字体添加到python3?

如何在具有保留字符宽度的 HTML 中使用等宽字体显示特殊的 unicode 字符

Unicode 字符如何映射到字体中的字形?

Bangla unicode 字体未在 mpdf 中显示

在基于 Debian 的系统上,如何找到字体具有字形的 Unicode 代码点?

为啥没有包含所有 Unicode 字形的字体? [关闭]