使用fontTools解析字体文件name数据表

使用fontTools解析字体文件name数据表

导入库

使用的库是fontTools

from fontTools.ttLib import TTFont

预备知识

一个字体文件中是存在很多张数据表的,不同数据表记录不同的信息,如“head”数据表会包含字体的全局信息,“glyf”数据表会包含字体字形的轮廓定义和调整指令……不同格式的字体文件所包含的数据表会有些许不同,但是都会包含基本的数据表。

以“cmap”表为例,该表定义了“字符代码”到“字形索引值”的映射关系,理论上读出该表的数据就可以读出字体中所包含的字符。

fontTools中,通过TTFont函数加载字体文件为一个实例,通过实例名["数据表名"]来访问数据表。

TTF格式字体文件数据表详解:Fonts - TrueType Reference Manual - Apple Developer

OTF格式字体文件数据表详解:OpenType specification (OpenType 1.9) - Typography | Microsoft Docs

name表解析

下面开始解析name数据表

fontPath = "F:\\font\\字魂1号-中国字魂.ttf"
fontObj = TTFont(fontPath)
nameTable = fontObj["name"]

设置断点调试可以看到该对象存在三个属性:dependenciesnamestableTag。其中names是我们需要的。

直接打印nameTable.names会得到一个名称记录(NameRecord)的列表,列表中每个元素包含NameIDPlatformIDLanguageID三个很重要的参数,请先记住。

[<NameRecord NameID=0; PlatformID=1; LanguageID=0>, …… <NameRecord NameID=14; PlatformID=3; LanguageID=2052>]

继续调试可以发现每个NameRecord都包含四个属性,除了刚刚提到的nameIDplatformIDlangID外,还有platEncID,string,后者就是我们需要提取的信息。

for i in nameTable.names:
    print(i.string)

b’Copyright© Shanghai ZiHun Network Technology Co.,Ltd.’
b’zihun1hao-zhongguozihun’
b’Regular’
……
\x00h\x00t\x00t\x00p\x00s\x00:\x00/\x00/\x00i\x00z\x00i\x00h\x00u\x00n\x00.\x00c\x00o\x00m\x00/’
b’\x00h\x00t\x00t\x00p\x00s\x00:\x00/\x00/\x00i\x00z\x00i\x00h\x00u\x00n\x00.\x00c\x00o\x00m\x00/’

输出的数据是bytes格式的,不利于阅读,需要解码。

在实际解码的过程中遇见大量问题,不同字体的NameRecord编码格式不一,甚至同一字体的不同NameRecord编码也会不一样,因此很难用一个通用的解码格式还原数据。

(通过阅读TTFont源码得知,fontTools的作者在进行输出时会事先调用自己编写的.toStr()方法,该方法会一定程度上自动预测编码格式,然后以对应的格式进行解码然后输出,绝大多数情况下该方法是可用的,但是经过大量字体测试后发现还是存在少部分字体的部分NameRecord无法被正确解码)

以for循环直接打印每个元素,是可以得到具体信息的。

for i in nameTable.names:
    print(i)  # 等价于print(i.toStr)

Copyright© Shanghai ZiHun Network Technology Co.,Ltd.
zihun1hao-zhongguozihun
Regular
……
商用需购买授权,请访问: https://izihun.com/
https://izihun.com/

其中的信息非常杂乱,有版权详情,有字体名,有字体样式,还有字体官网等等等等。

一般来说,一个name字段会包括但不限于下列信息:版权公告,字体家族名称,字体子家族名称,唯一字体标识符,完整字体名。

并且这些信息可能会重复,因为name表中会有平台和语言的区别。

通过之前的nameIDplatformIDlangID字段,可以定位字符串所表示的含义。

  • platformID(平台ID)0表示Unicode,1表示Mac,3表示Win
  • langID(语言ID)不同平台所对应的语言ID是不一样的。如简体中文在Mac下对应的langID是33,Win下则是2052
  • nameID(名称ID)主要定位ID,根据此ID定位具体字段,如nameID=3表示字体唯一标识符
    • langID是预定义的,除非另有说明,否则它们适用于所有平台
IDdescriptionMeaningExplains
0Copyright版权公告字体供应商提供的版权字符串
1Font Family字体家族名称用户看到的名称
2Font Subfamily字体子家族名称样式名称
3Unique font identifier唯一字体标识符供应用程序存储的唯一标识符,用于标识正在使用的字体
4Full font name完整字体名字体完整、唯一、可读的名称
5Version版本字符串字体供应商提供的版本信息
6PostScript字体的PostScript名称PostScript printer 上的字体名称
7Trademark商标商标字符串
8Manufacturer制造商名称制造商
9Designer设计师字体设计者的姓名
10Description字体的描述可以包含修订信息、使用建议、历史记录、功能等。
11URL Vendor字体供应商的URL字体供应商网址
12URL Designer设计师的URL字体设计师网址
13License许可证许可证说明
14URL License许可证信息URL许可证信息网址

不同平台的语言ID非常繁复,列出比较常用的:

  • Mac [简:33 繁:19 英:0 ]
  • Win [简:2052 台:1028 英:1033](十进制)
  • Win [简:0804 台:0404 英:0409](十六进制)

为什么Win要区分十进制ID和十六进制ID,因为win官网上列出来的语言ID是十六进制的,但是字体文件中的语言ID是十进制的,因此我们在解析的时候需要将十进制转换成十六进制,并且去掉之前的“0x”,如果不满四位还需要左补0。

综上,如果我们想要找到该字体在window平台上 简体中文语言下 所对应的商标,就应该找platformID=3 langID=2052 nameID=7的字段。

实际上,很多字体并不会包含以上所有信息,可能只包含win平台,或者只有部分nameID,大部分字体只会支持一个或两个langID,因此需要具体字体具体分析。

拓展

如果想一劳永逸(实际上并没有绝对的一劳永逸)解析字体name表,并以格式化的形式输出,可以参考以下思路:

  • 建立两个字典,一个mac,一个win
  • 对names列表中的每一个元素进行判断,如果platformID为1则添加到mac字典中,为3则添加到win字典中
  • 对mac和win字典下的每一个元素再循环判断,如果识别到指定langID,则新建一个字典并将其添加进去
  • 再对每一个langID字典进行循环判断,将指定的nameID转化成其对应含义。

参考数据组织形式:

{
    'mac': {
        'En': {
            'Copyright': 'Copyright(c) Shanghai ZiHun Network Technology Co.,Ltd.', 
            'Family': 'zihun1hao-zhongguozihun', 
            'Subfamily': 'Regular', 
            'UniqueID': 'zihun1hao-zhongguozihun-Regular', 
            'FullName': 'zihun1hao-zhongguozihun-Regular', 
            'Version': 'Version 1.00', 
            'PostScript': 'zihun1hao-zhongguozihun-Regular', 
            'Trademark': 'Shanghai ZiHun Network Technology Co.,Ltd.', 
            'Manufacturer': 'Shanghai ZiHun Network Technology Co.,Ltd.', 
            'Designer': 'Shanghai ZiHun Network Technology Co.,Ltd.', 
            'Description': 'https://izihun.com/', 
            'URLVendor': 'https://izihun.com/', 
            'URLDesigner': 'https://izihun.com/', 
            'License': 'Commercial use requires purchase authorization. Please visit: https://izihun.com/', 
            'URLLicense': 'https://izihun.com/'
        }, 
        'Ch': {
            'Copyright': 'Copyright(c) 上海字魂网络科技有限公司', 
            'Family': '字魂1号-中国字魂', 
            'Subfamily': 'Regular', 
            'UniqueID': 'zihun1hao-zhongguozihun-Regular', 
            'FullName': '字魂1号-中国字魂-Regular', 
            'Version': 'Version 1.00', 
            'PostScript': 'zihun1hao-zhongguozihun-Regular', 
            'Trademark': '上海字魂网络科技有限公司', 
            'Manufacturer': '上海字魂网络科技有限公司', 
            'Designer': '上海字魂网络科技有限公司', 
            'Description': 'https://izihun.com/', 
            'URLVendor': 'https://izihun.com/', 
            'URLDesigner': 'https://izihun.com/', 
            'License': '商用需购买授权,请访问: https://izihun.com/', 
            'URLLicense': 'https://izihun.com/'
        }
    }, 
    'win': {
        'US': {
            'Copyright': 'Copyright(c) Shanghai ZiHun Network Technology Co.,Ltd.', 
            'Family': 'zihun1hao-zhongguozihun', 
            'Subfamily': 'Regular', 
            'UniqueID': 'zihun1hao-zhongguozihun-Regular', 
            'FullName': 'zihun1hao-zhongguozihun-Regular', 
            'Version': 'Version 1.00', 
            'PostScript': 'zihun1hao-zhongguozihun-Regular', 
            'Trademark': 'Shanghai ZiHun Network Technology Co.,Ltd.', 
            'Manufacturer': 'Shanghai ZiHun Network Technology Co.,Ltd.', 
            'Designer': 'Shanghai ZiHun Network Technology Co.,Ltd.', 
            'Description': 'https://izihun.com/', 
            'URLVendor': 'https://izihun.com/', 
            'URLDesigner': 'https://izihun.com/', 
            'License': 'Commercial use requires purchase authorization. Please visit: https://izihun.com/', 
            'URLLicense': 'https://izihun.com/'
        }, 
        'Ch': {
            'Copyright': 'Copyright(c) 上海字魂网络科技有限公司', 
            'Family': '字魂1号-中国字魂', 
            'Subfamily': 'Regular', 
            'UniqueID': 'zihun1hao-zhongguozihun-Regular', 
            'FullName': '字魂1号-中国字魂-Regular', 
            'Version': 'Version 1.00', 
            'PostScript': 'zihun1hao-zhongguozihun-Regular', 
            'Trademark': '上海字魂网络科技有限公司', 
            'Manufacturer': '上海字魂网络科技有限公司', 
            'Designer': '上海字魂网络科技有限公司', 
            'Description': 'https://izihun.com/', 
            'URLVendor': 'https://izihun.com/', 
            'URLDesigner': 'https://izihun.com/', 
            'License': '商用需购买授权,请访问: https://izihun.com/', 
            'URLLicense': 'https://izihun.com/'
        }
    }
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值