获取TrueType字体信息

来源:互联网 发布:java迷你图书馆 编辑:程序博客网 时间:2024/05/17 11:04

引言

对TrueType字体有一定了解的人,相信一定对Windows中Fonts文件夹中中文字体文件显示的名字感到好奇。将中文字体复制到该目录下显示的是中文字体名,而将该字体复制到其它位置则没有享受到该待遇变成一串英文了,该文将讲述该实现背后的秘密。

TrueType字体格式说明

TrueType字体有一个文件头和很多表组成,具体结构如下所示:

> TrueType Header信息 + N个表头信息 + N个表信息  

TrueType Header信息

具体TrueType Header的头信息可以定义为如下结构:

typedef struct _tagTT_OFFSET_TABLE{    uint32 uVersion,    uint16 uNumOfTables,    uint16 uSearchRange,    uint16 uEntrySelector,    uint16 uRangeShift  }TTF_HEADER_TABLE;

如在C:\WINDOWS\FONTS\SIMHEI.TTF开头位置可找到如下所示字符信息(16进制格式显示)

00 01 00 00(snft Version)00 14(num of Tables)01 00(Search Range)00 04(Entry Selector)00 40(Range Shift)

表头信息

紧随TrueType Header信息之后的就是各个表头的信息,表头信息的构成主要如下所示:

表名 + 校验和 + 偏移信息 + 表的长度信息

具体表头的信息可以定义为如下结构:

typedef struct _tagTT_TABLE_DIRECTORY{  char szTag[4]; //table name  ULONG uCheckSum; //Check sum  ULONG uOffset; //Offset from beginning of file  ULONG uLength; //length of the table in bytes}TT_TABLE_DIRECTORY;

如在可在C:\WINDOWS\FONTS\SIMHEI.TTF字体TTF Header信息之后可找到如下字符信息(16进制格式显示)

44 53 49 47(表名)6D A0 9D 86(校验和)00 94 B1 6C(该表在文件中起始位置相对文件头的偏移量)00 00 1B 3C(该表的长度)

字体信息表

字体信息主要保存在name表中,该表的结构如下所示:

name表头 + N个表记录

name表头(非官方名)可定义为如下结构:

//Header of names tabletypedef struct _tagTT_NAME_TABLE_HEADER{  uint16 uFSelector; //format selector. Always 0  uint16 uNRCount; //Name Records count  uint16 uStorageOffset; //Offset for strings storage,from start of the table}TT_NAME_TABLE_HEADER;

name表头举例,可在C:\WINDOWS\FONTS\SIMHEI.TTF字体中获取到name表头信息如下所示(使用ttfdump可直接获取可直接识别信息)

'name' Table - Naming Table---------------------------Format:     0Count:      40stringOffset:    486

表记录的结构可定义为如下结构:

//Record in names tabletypedef struct _tagTT_NAME_RECORD{  uint16 uPlatformID;  uint16 uEncodingID;  uint16 uLanguageID;  uint16 uNameID;  uint16 uStringLength;  uint16 uStringOffset; //from start of storage area}TT_NAME_RECORD;

表记录举例,可在C:\WINDOWS\FONTS\SIMHEI.TTF字体中name Records中获取到如下所示信息:

29.  Platform ID:   3     Specific ID:   1     Language ID:   2052     Name ID:       1     Length:        4     Offset:        536    Data: 9E D1 4F 53                    >  炑OS

其中Data:9E D1 4F 53为”黑体”在计算机中的Unicode16编码。想检验比较简单的方式是直接将”黑体”输入一个空文本文件保存为unicode的格式,然后用16进制打开即可查看其对应的Unicode编码,或者在网上直接找汉字编码在线查询网址也可。

具体关于平台ID和语言ID和NameId具体代表的含义可查看参考信息中相关网页或文档。

字体信息查看工具

ttfdump简介

windows官方提供工具,具体下载地址为:https://www.microsoft.com/en-us/Typography/tools.aspx。

该字体的具体使用说明可参考TTFDUMP的帮助手册,具体获取方式为在命令行下键入ttfdump即可获得如下所示的使用说明

D:\ttf\FontTools>ttfdump; TrueType v1.0 Dump Program - v1.8, Oct 29 2002, rrt, dra, gch, ddb, lcp, pml; Copyright (C) 1991 ZSoft Corporation. All rights reserved.; Portions Copyright (C) 1991-2001 Microsoft Corporation. All rights reserved.Usage: TTFDUMP <filename> [-nNNNN] [-tCCCC] [-h] [-zHHH] [-cNNNN] [-q]<filename>  - TrueType .TTF (or .T2 or .ROY or .TTC) filename

获取simhei字体name表信息命令格式如下所示:

ttfdump C:\WINDOWS\FONTS\SIMHEI.TTF -n20 -tname > simheiname.txt

Linux环境下也有类似的ttf字体查看工具也叫ttfdump,具体用法请自行研究。

FontForge简介

开源图形化工具,操作简单,这里就不多做介绍了,具体请参考官方网站说明,网址为:http://fontforge.github.io/en-US/。

参考资料

  • 从TTF字体中获取字体名:http://http://www.codeproject.com/Articles/2293/Retrieving-font-name-from-TTF-file

  • Apple官方TrueType字体标准https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6.html#Overview

  • 微软官方TrueType字体标准https://www.microsoft.com/en-us/Typography/SpecificationsOverview.aspx

0 0