前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一日一技:如何判断某个汉字是不是在字体库中

一日一技:如何判断某个汉字是不是在字体库中

作者头像
青南
发布2020-01-17 15:42:07
3.1K0
发布2020-01-17 15:42:07
举报
文章被收录于专栏:未闻Code未闻Code

摄影:产品经理

下厨:kingname

我们喜欢从网上下载各种各样的中文字体,但这些字体一般只设计了常用汉字,遇到生僻字时就会变成系统默认字体。如下图所示为方正静蕾简体,没有“龍鑨”两个汉字:

现在,我手上有10000个汉字,我如何快速确定哪些汉字在这个字体库中呢?

为了解决这个问题,我们需要安装 Python 的一个第三方库:fontTools

首先我们来安装它:

代码语言:javascript
复制
python3 -m pip install fonttools

然后,我们编写代码,读取字体库中的所有字体:

代码语言:javascript
复制
from fontTools.ttLib import TTFont

font = TTFont('方正静蕾体.ttf')
unicode_map = font['cmap'].tables[0].ttFont.getBestCmap()

这段代码获取的 unicode_map是一个字典,字典的 key 是这个字体库中所有字符的 unicode 码。所以,如果我们要检查某个汉字在不在这个字体库中,只需要检查汉字的 unicode 码在不在unicode_map中即可:

代码语言:javascript
复制
words = '一二龍三四'
for word in words:
    if ord(word) in unicode_map:
        print(f'字体库中有:【{word}】这个汉字')
    else:
        print(f'字体库没有:【{word}】这个汉字')

运行效果如下图所示:

对于守规矩的字体,这样写就足够了。但是有一些字体,他们明明没有某个汉字,却非要把这个汉字的 unicode 码添加到 unicode_map中,所以我们还可以再进一步检验:

代码语言:javascript
复制
glyf_map = font['glyf']
if len(glyf_map[unicode_map[ord(word)]].getCoordinates(0)[0]) == 0:
            print(f'字符:【{word}】确实不在字体库中')

完整的代码如下图所示:

代码语言:javascript
复制
from fontTools.ttLib import TTFont

font = TTFont('方正静蕾体.ttf')
unicode_map = font['cmap'].tables[0].ttFont.getBestCmap()
glyf_map = font['glyf']
words = '一二龍三四'
for word in words:
    if ord(word) in unicode_map and len(glyf_map[unicode_map[ord(word)]].getCoordinates(0)[0]) > 0:
        print(f'字体库中有:【{word}】这个汉字')
        continue
    print(f'字体库没有:【{word}】这个汉字')
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 未闻Code 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档