# 动手拆子集：pyftsubset

> 适合谁看：想把一款字体裁成只含页面用到的字、转成 WOFF2 自己部署的开发者。

先确认许可允许修改和网页使用，见[《自托管网页字体的许可要点》](https://docs.cocobook.com/link/1256)。

## 准备

`pyftsubset` 是 fontTools 自带的子集工具。要输出 WOFF2，还需要 brotli：

```bash
pip install fonttools brotli
```

## 最常用的三种用法

**按一段文字裁：** 适合标题、Logo 文字、活动页。

```bash
pyftsubset SourceHanSerifSC-Bold.otf \
  --text="春日限定 立即报名" \
  --flavor=woff2 \
  --output-file=title.woff2
```

**按文字文件裁：** 把页面上所有文字导出到一个文本文件。

```bash
pyftsubset font.ttf --text-file=chars.txt --flavor=woff2 --output-file=page.woff2
```

**按码位范围裁：** 例如只留基本拉丁字母和中日韩统一表意文字基本区。

```bash
pyftsubset font.ttf --unicodes="U+0020-007E,U+4E00-9FFF" --flavor=woff2 --output-file=cjk-basic.woff2
```

## 别把许可信息裁掉

`pyftsubset` 默认只保留字体名称表里编号 0 到 6 的记录，并且只保留英文的记录。许可说明（编号 13）和许可网址（编号 14）默认会被删掉，中文字体名也会被删掉。自己部署开源字体时，建议加上：

```bash
--name-IDs='*' --name-languages='*'
```

这样字体文件里仍然带着版权和许可信息。

## 排版功能

`pyftsubset` 默认保留一批常用的 OpenType 功能，包括竖排相关的 `vert`、`vrt2` 和标点挤压相关的 `halt`、`vhal`、`palt`、`vpal`、`chws`、`vchw` 等。要指定保留哪些功能，用 `--layout-features`；要保留全部，用 `--layout-features='*'`。

## 注意事项

- **按页面文字裁，内容一变就缺字。** 有用户输入、评论、搜索的地方，不要用固定子集，用分片方案（见下一页）。
- **记得标点和数字。** 中文标点、全角空格、数字、常用符号都要包含在内。
- **改名。** 开源字体有「保留字体名」时，裁过的字体按许可算修改版，`font-family` 和文件里的名字最好换掉，见[《SIL 开放字体许可证（OFL）逐条读》](https://docs.cocobook.com/link/1244)。

<p style="margin-top:2.5em;padding-top:.6em;border-top:1px solid #e6e6e6;font-size:.85em;color:#8a8a8a"><a href="https://docs.cocobook.com/link/1307#bkmrk-src-w02-subset" style="color:inherit;text-decoration:none;border-bottom:1px dotted #bbb">参考资料</a></p>