字体和字符集
字符集就是Character Sets。字符集中的每个字符都有一个数字与之对应。在Windows中有以下几种字符集在使用。
Windows Character Set:本质上与US ASCII character set一样,第一个字符的数字是0x20,最有一个是0xFF。对于字符集上不存在的字符,会用默认字型显示,如Raster和Vector字体会用.来显示,而TTF则会用方框表示。
Unicode Character Set:用2个字节的数字来表示多达2^16个字符(好像后来增加到4个字节),每个字符有独立的数字表示。注意这里是字符集,而不是编码。
另外还有OEM Character Set、Symbol Character Set和Vendor-Specific Characters Sets等
TTF文件结构
TTF字体文件后缀是ttf,TTF还允许不同的字体组合在一个文件中,这时候后缀为ttc,就是TrueType collect的意思。
TTF文件是由一系列的表组成的。第一张表就是font directory,它很特殊,专门用来指示其他的表;进阶着就是包含font数据的其他表。每个表有一个四字符定义的表名,其中有些表是要求每个font文件必备的。如:
cmap |
定义了字符到字形索引的对应关系,就是通过字内码得到表loca中使用的index。包含了多个子表,用于支持不同的平台和编码集 |
glyf |
包含了字形数据,就是字形的轮廓定义和调整指令 |
head |
定义了font header,字体全局信息 |
hhea |
定义了水平header |
hmtx |
定义了水平metric |
loca |
定义了各字形在glyf表中偏移,根据cmap中得到的字形索引,在这里能够得到对应的字型在glyf表中的偏移 |
maxp |
定义了最大值profile,用于为字体分配内存 |
name |
定义字体名称、风格名以及版权说明等 |
post |
PostScript |
有一个问题,字符如何在TTF文件中找到自己的字形呢,见下面的说明:
详细说明一下cmap表,因为这个表是最重要的。由于存在不同的系统和编码集,cmap表内涵多个子表,每个子表包含的基本信息有系统ID、编码集以及在表的偏移量。一般系统ID有3和1,前者是Windows,后者是Macintosh。一般而言,TTF文件至少包含两张子表,即Macintosh的Roman体系(PlatformID=1, Encoding=0)和Windows的UGI体系(PlatformID=3, Encoding=1),其中Encoding=1就是Unicode编码。这些子表中保存了字符内码到glyph index的对应。拿到glyph index的值可以到表loca中查到对应glyph表glyf中的偏移。
在Windows中,可以用下面的WIN32 API获得字体信息。
DWORD GetFontData(HDC hDC,DWORD dwTable ,DWORD dwOffset, LPVOID lpbBuffer ,DWORD cbData)
相关开源库:
FreeType
官网:http://www.freetype.org/
源码下载:http://sourceforge.net/projects/freetype/files/freetype2/2.5.0/freetype-2.5.0.1.tar.gz/download
FontForge:字体的开发工具
用于开发和编辑字体的开源工具,详见http://fontforge.sourceforge.net/
文件结构的介绍及c的实现
http://www.codeproject.com/Articles/2293/Retrieving-font-name-from-TTF-file
字体编辑工具
FontCreator 6.0
下载地址:http://xiazai.xiazaiba.com/Soft/F/FontCreator_6.0_XiaZaiBa.exe
相关制作方法:http://www.cnblogs.com/Jingkunliu/archive/2011/11/21/2452135.html