在TrueFont字体里,使用Unicode来标记字符,但是Unicode是一个非常庞大的集合,所以考虑到适用性,一些字体只会选取Unicode的某一类字符设计字体,比如英文字体通常没有汉字,汉鼎简中黑-站长字体里的汉鼎简中黑字体没有数字。

在Python编程环境中,我使用Pillow (PIL Fork) 3.0.0 documentation进行字体的绘制,然而查阅文档我发现,如果字体没有某字符的话,仍然是能够绘制的,但是绘制的结果是一片空白。排除这种情况一个很直观的做法就是判断绘制的图片是不是一片白色,但我认为这种做法不是那么elegant,这里我试着从字体除法去判断字符是否在字体里。


这里需要利用FontTools及字体文件结构的信息,有兴趣的可以参考Michael:解决了困扰了一个礼拜的一个坑,只在Windows下可以使用的一个字体终于可以在Linux下使用了。

使用的库就是FontTools,可以这样安装:

pip install fontTools

安装后输入如下代码:

from fontTools.ttLib import TTFont
fontType = os.path.join("fonts", "KyhotaOne.ttf")font = TTFont(fontType)
uniMap = font['cmap'].tables[0].ttFont.getBestCmap()

打印uniMap,得到如下信息:

{32: 'space', 33: 'exclam', 34: 'quotedbl',...}

可以看到,key代表的unicode的int值,value代表unicode的名字。比如32: 'space'就表示unicode=32表示space。

知道这个信息后,就可以这样来判断字符是否在字体里了:

print (ord('1') in uniMap.keys())
print (ord('A') in uniMap.keys())
print (ord('一') in uniMap.keys())

结果是:

True
True
False

【2019年5月15日更新】

感觉很多字体真像无良字体,明明没有一些字符非要加到表里,结果就是按照上述方法打印出来是空白的,如果你观察其glyf表的话,是没有contour的。

这种情况最好判定下cmap里面的内容在glyf表里是否有对应的contour,我一般是这么处理的:

glyfMapDict = TTFont(fontType)['glyf']
len(glyfMapDict[ord('1')].getCoordinates(0)[0])

如果长度为0表示该字体是没有用的,反之可以用。

【已完结】

判断文件中字符是否存在_使用Python库判断字符是否在字体里相关推荐

  1. python中font的用法_使用Python库判断字符是否在字体里

    在TrueFont字体里,使用Unicode来标记字符,但是Unicode是一个非常庞大的集合,所以考虑到适用性,一些字体只会选取Unicode的某一类字符设计字体,比如英文字体通常没有汉字,汉鼎简中 ...

  2. python文件中单词的删除_使用python删除文件中的多余单词

    嗨,我正在学习Python,出于好奇,我编写了一个程序来删除文件中多余的单词. 我正在比较文件text1.txt中的测试.和'text2.txt',基于text1中的测试,我删除了test2中多余的单 ...

  3. java 判断文件类型是否是音频_用java流方式判断文件类型

    这个方法只能在有限的范围内有效.并不是万金油 比如 图片类型判断,音频文件格式判断,视频文件格式判断等这种肯定是2进制且专业性很强的文件类型判断. 下面给出完整版代码 首先是文件类型枚取 packag ...

  4. python对csv文件中的数据进行分类_利用Python对csv文件中的数据进行排序

    代码如下: #导入包 import pandas as pd from pandas import DataFrame,Series #设置路径 path='C:\\Users\\jyjh\\Desk ...

  5. python对csv文件中的数据进行分类_使用Python读取csv文件并进行分类存储

    同学叫我帮忙用Python做csv表格分类,整理一下遇到的问题及解决方案 原生数据文件TEST.csv: 如图我需要根据G列内容,分别对A,B,C进行分类到A.csv,B.csv,C.csv 上代码, ...

  6. python读取rtf文件中指定的内容_使用Python读取RTF文件时遇到欧元符号问题

    RTF标准使用UTF-16,但形状适合RTF命令序列格式.记录在http://en.wikipedia.org/wiki/Rich_Text_Format#Character_encoding.遗憾的 ...

  7. python从文件中提取特定文本_使用Python从HTML文件中提取文本

    我发现最好的一段代码用于提取文本,而不需要javascript或不需要的东西:import urllibfrom bs4 import BeautifulSoupurl = "http:// ...

  8. 不容错过,数据分析中最常用的10大Python库

    学习数据分析绝非易事,有无数种工具和资源可供使用.因此,有时会让我们很难弄清楚该学习什么技能,该使用哪种工具. 在本文中,我们就来给大家介绍一下数据分析中最常用的10个Python库.看看这些库你都用 ...

  9. 关于python字符编码以下选项中错误的是_关于Python文件打开模式的描述,以下选项中错误的是...

    [单选题]下列Python保留字中,不用于表示分支结构的是 [单选题]下列哪项不是python中文件的读取操作 [单选题]以下程序的输出结果是: s='' ls = [1,2,3,4] for l i ...

  10. python中怎么统计英文字符的个数_【Python练习1】统计一串字符中英文字母、空格、数字和其他字符的个数...

    练习思路: 1.输入一串字符 2.筛选出字符中的英文字母并统计 3.筛选出字符中的空格并统计 4.筛选出字符中的数字并统计 5.筛选出字符中的其他字符并统计 代码实现: def msg(s): abc ...

最新文章

  1. python使用lxml及request爬取-python用lxml解析网页为什么不完整?
  2. 安装完python后怎么使用-python安装后怎么启用
  3. Linux信号列表(非实时信号和实时信号)
  4. 找出所有层级_数轴上的行程问题1:你的数学思维水平在哪一个层级?
  5. web自动化原理揭秘
  6. java 一个list根据另一个list进行排序_java – 基于另一个List对List进行排序
  7. 20160504课堂作业
  8. python入门经典100题
  9. [SCU 4507] 奶牛情书 (AC自动机)
  10. 洛谷刷题笔记 最高分数的学生姓名
  11. 富文本编辑器ueditor——找不到ueditor.all.js以及ueditor.all.min.js文件
  12. 休闲实用英语:别误会这些英文的意思
  13. oenwrt 进不了bios_J1900在openwrt不能正常重启的BIOS选项说明
  14. 相机帧率与曝光的关系
  15. 3D打印肝模型抢救生命
  16. nvme命令中prp_Linux nvme驱动分析之块设备层
  17. 485通信c语言编程linux,Rs485通信单片机C程序
  18. 数据规整:连接、联合与重塑(数据分析)
  19. MSRN:Multi-scale Residual Network for Image Super-Resolution 论文理解
  20. Quick #UE4 Tip (第3周 2020.4.10)

热门文章

  1. java类库中的设计模式
  2. Firefox 火狐网址生成二维码扩展推荐
  3. [转]MS Sql 7105错误
  4. 提高局域网速度的21招
  5. .NET框架类在ASP.NET中的使用(1)——QA
  6. React 详解,组件,条件渲染
  7. Flutter 的ButtonBar
  8. 广州仙村中学2021高考成绩查询,仙村中学(增城区)
  9. python高级编程教程_python高级编程——入门语法(一)
  10. php从入门到精通分享,PHP从入门到精通学习路线图分享