对TrueType字体有一定了解的人,相信一定对Windows中Fonts文件夹中中文字体文件显示的名字感到好奇。将中文字体复制到该目录下显示的是中文字体名,而将该字体复制到其它位置则没有享受到该待遇变成一串英文了,该文将讲述该实现背后的秘密。
TrueType字体有一个文件头和很多表组成,具体结构如下所示:
> TrueType Header信息 + N个表头信息 + N个表信息
具体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具体代表的含义可查看参考信息中相关网页或文档。
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,具体用法请自行研究。
开源图形化工具,操作简单,这里就不多做介绍了,具体请参考官方网站说明,网址为: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