获取TrueType字体信息

引言

对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 table
typedef 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:     0
Count:      40
stringOffset:    486

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

//Record in names table
typedef 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  [-nNNNN] [-tCCCC] [-h] [-zHHH] [-cNNNN] [-q]  - 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

你可能感兴趣的:(字体)