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字符的主要内容,如果未能解决你的问题,请参考以下文章
如何在具有保留字符宽度的 HTML 中使用等宽字体显示特殊的 unicode 字符