一文讀懂字符、字形、字體
完整內容也可以在公眾號「非專業程序員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,如:
// 這里的 descriptor 只是描述條件,真正的字體對象是 font
let descriptor = CTFontDescriptorCreateWithAttributes([
kCTFontFamilyNameAttribute: "Microsoft YaHei",
kCTFontWeightTrait: 0.8
])
let font = CTFontCreateWithFontDescriptor(descriptor, 14, nil)
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文件內容,這里先理解二者的概念。
五、文字排版的基本概念
| 基本概念 | 解釋 |
|---|---|
| metrics | 由字體設計師提供,用于描述每個Glyph周圍的間距 |
| advance width | 前進寬度,基線方向到下一個Glyph origin的距離,或者理解為字形繪制完后,光標應該前進多少距離 |
| left-side bearing | Glyph origin與Glyph左側的間距 |
| right-side bearing | Glyph右側與advance width終點的距離 |
| ascent | Glyph origin到Font中最高Glyph的頂部距離 |
| descent | Glyph origin到Font中最低Glyph的底部距離 |
| bounding box bounding rectangle |
包含Glyph可視區域(注意非advance width)最小rect |
| kerning | 通常,Glyph一般按advance width排列,但為了提高可讀性,通常會引入kerning來擴大或縮小兩個glyph之間的間距,比如W和A:![]() |
| leading/linegap | line之間的添加的距離 |
| lineHeight | lineHeight = ascent + descent + leading |
一圖勝過千言,貼兩張經典的圖:
| 圖一 | 圖二 |
|---|---|
![]() |
![]() |
更多精彩內容歡迎關注??公眾號:非專業程序員Ping
posted on 2025-10-21 13:16 非專業程序員Ping 閱讀(263) 評論(7) 收藏 舉報



浙公網安備 33010602011771號