一文读懂字符、字形、字体
这篇文章是从 0 到 1 自定义富文本渲染的原理篇之一,此外你还可能感兴趣:
欢迎关注同名公众号:非专业程序员 Ping
一、引言
什么是 Character?什么是 Glyph?Character 和 Glyph 是否一一对应?我们常说的 Font 又包含哪些东西?如果要自己实现一套文本的分词、测量和布局,又需要理清楚哪些概念?ascent、descent、lineHeight 之间的关系是怎么样的?
本文将尽量以简洁易懂的方式来解释以上问题,也可以提前 Mark 起来,作为日后的速查手册。
二、Character
Character 也叫字符,是一个抽象概念,比如字母A、中文你等都可以视为一个字符,它只是一个语义单位,不关心具体长什么样。
三、Glpyh
Glpyh 也叫字形,表示字符的绘制方式;一个字符可以有多种方式绘制,比如字母 A,可以有不同的大小、粗细、斜体、衬线等,但都是同一个字符;这些不同的绘制方式,都叫字形。
 
 3.1 Character 与 Glyph 的关系
字符与字形并非一一对应关系,一个字符可以由多个字形表示,比如é可以是e和重音符号´的组合,在一些连字情况下,一个字形也可以代表多个字符,如下:
 
 四、Font
4.1 Typeface
指一套具有统一设计风格的 Font 集合,它是一种设计概念,而不是具体的文件
4.2 Font
Font 可以理解成 Typeface 的某个具体实现。
以 Helvetica 为例:
- Typeface:Helvetica 
- Font: 
- Helvetica Regular.ttf 
- Helvetica Bold.ttf 
- Helvetica Italic.ttf 
- Helvetica Bold Italic.ttf 
4.3 Font Family
Font Family 是一组属于同一个 Typeface 的字体(Fonts),它们共享设计风格,只是字重/宽度/样式不同。
比如:Helvetica 是一个 Font Family,里面包含字体:
- Helvetica Regular 
- Helvetica Bold 
- Helvetica Italic 
- Helvetica Bold Italic 
4.4 Font Descriptor
Font Descriptor(字体描述符)是一种属性集合(Font Family、Font Weight、样式 (italic/oblique)、大小等),用来描述或查询一个字体;它不是字体文件,而是一个“过滤条件”或“配置对象”,在 CoreText 里对应 CTFontDescriptor。
Font Descriptor 可以用于匹配系统中符合条件的字体,也可以用它来派生一个具体的 CTFont,如:
4.5 Font Collections
Font Collections 是一组字体的集合,通常用于检索和筛选,在 CoreText 里对应 CTFontCollection。
它可以包含系统中所有可用字体,也可以按条件过滤出子集,主要用途有:
- 枚举系统安装的字体 
- 根据 - Font Descriptor找到所有匹配的字体
- 做字体选择器 UI(比如 Word 里的字体下拉框) 
4.6 小结
 
 4.7 Glyph 与 Font 的关系
简单理解,Font 里存储了 Glyph 的绘制样式,Glyph 与 Unicode 的映射关系等。
Font 里有各种各样的表,存储了 Unicode code point 与 GlyphID 的映射关系,每个 Glyph 绘制时的 advance width 和 left side bearing 等,后续会有单独的文章详细解析 Font 文件内容,这里先理解二者的概念。
五、文字排版的基本概念
一图胜过千言,贴两张经典的图:
 
  
 更多精彩内容欢迎关注🌍公众号:非专业程序员 Ping
版权声明: 本文为 InfoQ 作者【非专业程序员Ping】的原创文章。
原文链接:【http://xie.infoq.cn/article/36b3a2abb64ce5088b0f515bf】。文章转载请联系作者。








 
    
评论