快速上手
适用读者:已有 TTF/OTF 字体,需要制作固定尺寸点阵并核对固件读取格式的嵌入式开发者。
工具入口:GT-FontLab Plus 字库生成工具;编码辅助:字符编码在线查询工具。
1 环境与参数
先确认浏览器、字体许可和目标固件的读取约定,再用一组明确参数完成首次打样。
准备浏览器和字体
- 使用桌面版 Chrome / Edge。系统字体入口依赖 Local Font Access、安全上下文、用户手势和授权;浏览器不支持或不愿授权时,改用本地 TTF/OTF 文件。
- 确认字体许可证覆盖你的点阵化、嵌入、商业使用和再分发方式,并保留版权及许可文本。
- 本手册实测字体为 思源黑体 CN Regular / SourceHanSansCN-Regular,Version 1.000。字体 name 表内许可证为 Apache License 2.0。示例只展示取模结果,不再分发字体文件。
先向固件侧确认读取约定
至少确认以下参数,不要等导出后再猜:
| 参数 | 本手册示例 | 必须核对的原因 |
|---|---|---|
| 点阵宽高 | 24×24 | 决定单字点阵尺寸 |
| 位深 | 1bpp | 决定黑白或灰度及每字字节数 |
| 扫描方向 | 横向扫描 | 决定像素按行还是按列排列 |
| 字节位序 | MSB first | 决定第一个像素位于高位还是低位像素槽 |
| 字符顺序 | 自定义文本原顺序 | 决定 BIN 偏移及 CSV 记录顺序 |
| 补零方式 | 行或列末端补零 | 非整字节对齐时影响读取结果 |
本手册的最终结果
使用“高通字库ABC1”8 个字符,生成 24×24、1bpp、横向、MSB first 的点阵,阈值采用 100,自动居中开启。完整 ZIP 应包含 576 字节 font.bin、font.c、mapping.csv、manifest.json、README.txt 和 8 张逐字 PNG。
快速配置、配置复用与容量提示
“取模参数”右上角提供中文 24×24 黑白、ASCII 16×16 黑白、中文 24×24 8bpp 灰度三个快速配置。应用后会替换当前字符选择和取模参数,但保留已加载字体;继续使用前应核对字符范围是否仍符合目标。
“导出配置”保存 gt-fontlab-project-v1 JSON,“导入”可恢复其中的字符选择与取模参数。配置不包含字体文件,也不保存逐字像素修改;导入后需继续选择或沿用当前字体。字符集下方的“字符数 × 单字字节数 = 总容量”和相对同尺寸 1bpp 的倍数可用于修改前后的容量比较。
2 选择字体
可以使用已授权的系统字体,也可以选择本地 TTF/OTF 文件;两种方式都由浏览器在你操作后读取字体。
系统字体入口
- 点击“选择系统字体(推荐)”。
- 在浏览器提示中允许读取本地字体。
- 按中文名、英文名或 PostScript 名称搜索。本手册搜索
SourceHanSansCN-Regular。 - 点击对应字体卡片,等待页面显示“已在浏览器本地加载”。
图 1|系统字体选择:搜索并选用思源黑体
字体文件回退入口
点击“选择或拖入 TTF / OTF”,选择单个字体文件。页面当前标称文件上限为 50 MiB;该上限不是大文件压力测试结论。文件入口不接受 WOFF/WOFF2,也不应把系统字体入口的 TTC 字型选择能力理解为上传 TTC 后也有同样的选择界面。
字体解析、栅格化、打包和导出不由服务器执行;首次打开页面仍需下载 JS/WASM 静态程序资源。
3 设置字符
先明确导出范围和字符顺序,再检查定位后的字符集、原始编码与有效字符数量。
先分清两种用法:完整字库,还是固定文案子集
“输入模式”决定导出范围,两种最常见的需求对应两种选法:
| 你的需求 | 输入模式选什么 | 说明 |
|---|---|---|
| 导出完整字库(整个字符集) | 对应的标准字符集,如 GB2312 汉字区、BIG5、JIS X 0208 | BIN 中字符顺序即该字符集的排列顺序,mapping.csv 的 encoded 列为对应原始编码(如 GB2312 的 0xB8DF),固件可按编码直接换算偏移;字体加载后自动应用的字符集建议,服务的正是这一用法 |
| 只导出界面固定文案(几个到几十个字) | 自定义字符文本 | 粘贴界面实际用到的字符,容量最小;encoded 为 Unicode 码点、顺序为输入顺序 |
导出完整字库时,请直接选择标准字符集,不要把整个字符集粘贴进“自定义字符文本”:粘贴方式容易引入漏字与重复,encoded 与顺序约定也和固件按原始编码索引的预期对不上。第 7 章“整库导出实测”中 GB2312 全集 6,768 字的导出,就是选标准字符集后直接完成的,不需要任何自定义输入。
字体语言区域建议:加载后自动应用
字体加载完成后,“2. 字符集”卡片顶部会出现一条“字体检测建议”,例如新宋体显示 GB2312 汉字区 99.9% · BIG5 99.5% · JIS X 0208 99.2%。它来自工具对 GB2312、GBK、BIG5、JIS X 0208、Shift_JIS、KSC 5601 六个候选字符集全量逐字查询字体实际覆盖的统计结果,不是只看字体文件里的声明信息;同一语言只保留覆盖最高的一个字符集(简体中文不会同时推荐 GB2312 和 GBK),最多显示三组,纯西文字体不会出现建议条。
加载完成后,工具会自动应用排序最优的一组建议,并提示“按语言区域检测结果自动应用「××」,导出字符范围、BIN 顺序和 CSV 编码已随之改变”。最优一组的挑选规则:优先字体 OS/2 表声明的目标代码页;覆盖率差距明显(≥2%)时按覆盖降序;覆盖率接近时按简中 → 繁中 → 日 → 韩的顺序决出——像思源黑体这类泛 CJK 字体的日文区覆盖率常反超简中区零点几个百分点,单纯按覆盖率排序会误推荐日文字符集。
自动应用只发生在字体加载这一时点,之后不会静默改动导出范围。如果自动应用的字符集不是目标语言,直接在“输入模式”下拉改回,或当建议条还显示其他候选时点击右侧“应用”按钮切换;像思源黑体这类覆盖多语言的字体建议条会保留多组排名备选。
先观察自动切换提示
- 保持“输入模式”为 ASCII。
- 在“字符或编码定位”中输入
高。 - 点击“定位字符”。
- 页面切换为 GB2312 汉字区,定位到 U+9AD8、原始编码 0xB8DF,并提示“导出字符范围、BIN 顺序和 CSV 编码也已随之改变”。
图 2|字符定位与自动字符集切换
这个提示说明字符集会影响实际导出,而不只是筛选预览。切换后应检查“有效字符”和“预计点阵”,避免把单字定位误当成只导出一个字符。还要注意:除 Shift_JIS 明确包含 ASCII 外,其他东亚标准字符集不会自动附加英文和数字;同时需要中英文时,应检查有效字符列表,或改用自定义范围 / 自定义字符文本。
改成本手册的 8 字符自定义范围
下面演示的是固定文案子集的配置方法(完整字库按上一节选标准字符集即可):
- 将“输入模式”改为“自定义字符文本”。
- 输入
高通字库ABC1。 - 保持“字符去重”和“忽略空白”勾选,不勾“按码点排序”,保留输入顺序。
- 确认“有效字符”为 8。
- 用字符定位或前后切换按钮逐字检查。
自定义文本按 Unicode code point 拆分,不是复杂文字排版。TXT 导入按 UTF-8 文本读取,页面标称上限为 2 MiB。
4 调整点阵
设置字号、点阵宽高和字形位置,并在正式导出前排除非预期裁切。
- 字号选择
24,单位为Pixel。 - 勾选“字号与点阵宽高联动(正方形)”,确认点阵宽、高均为
24。 - 保持水平、垂直偏移为
0,勾选“自动居中字形”。 - 如需手动调整,使用十字方向键;普通点击移动 1 像素,Shift + 点击移动 8 像素,回中按钮将偏移归零。
裁切排查示例
为了验证裁切提示,本地实测先定位 GB2312 汉字区的“高”,再临时设置为 28 Pixel、解除宽高联动并保持 24×24。预览画布中字形仍可辨认,但上下两端超出点阵:顶部的点与底部的横笔被裁掉一部分,页面出现真实裁切警告;自动居中开启也只能让超出均分到两端,并不能避免超界字形被裁切。正常使用时保持宽高联动开启即可:选择 28 Pixel 时点阵会自动跟随为 28×28,不会出现这种裁切;本例刻意解除联动构造错误参数,只为演示警告出现时的样貌与排查方法。
图 3|裁切警告示例(刻意构造的错误参数)
看完此图后恢复 24 Pixel、24×24,再重新勾选宽高联动。裁切结果会写入完整 ZIP 的 CSV 与 manifest,因此正式导出前应消除非预期裁切。
5 阈值与灰度
1bpp 可通过多字对比选择阈值;2 / 4 / 8bpp 则重点检查实际灰度与通用 RAW 布局。
1bpp:多字阈值比较
- 输出位深选择
1bpp · 黑白。 - 在“多字打样文本”输入
高通A1。 - 点击“生成对比”,查看 40、70、100、140 四档真实点阵。
- 点击“较高阈值 · 100”右上角的“采用”,确认正式“二值化阈值”变为
100。
图 4|多字阈值比较:四档并排可一键采用
当前算法按 alpha × 200 > threshold × 255 判断字色,因此阈值越高,通常保留的边缘像素越少;具体效果仍随字体、字号和字符变化。不要把固定数值机械理解成所有字体都适用的“粗体”或“细体”。
多字打样最多保留 8 个去重后的非空白字符。比较不会改变正式导出字符集;未点击“采用”的档位也不会改变正式阈值。
2 / 4 / 8bpp:检查灰度与 RAW 边界
需要灰度时,将自定义字符文本临时改为 高,再将输出位深改为 2bpp · 4 级灰度、4bpp · 16 级灰度 或 8bpp · 256 级灰度。此时阈值输入禁用,工具按 Alpha 量化;预览可看到多种实际灰度,而不是只有黑白两色。
图 5|4bpp 灰度与通用 RAW 提示
2 / 4 / 8bpp 当前是通用 RAW 灰度布局,不等于已经兼容 GT-HMI 自制字库读取约定。本手册最终导出仍回到 1bpp。24×24 下,四种位深的每字点阵大小如下:
| 位深 | 每字点阵字节数 | 本例 8 字合计 |
|---|---|---|
| 1bpp | 72 B | 576 B |
| 2bpp | 144 B | 1,152 B |
| 4bpp | 288 B | 2,304 B |
| 8bpp | 576 B | 4,608 B |
6 整批字库检查
单字预览只能确认参数和个别字形;正式导出前,先用整批检查核对整个字符集的缺字与裁切,再确认界面文案是否都能显示。
整批实时检查:无需先导出
点击页面顶部“整批字库预览”Tab,或打开整批字库预览直达入口。该工作区复用本机 FreeType/WASM,点击“检查当前页”后才生成当前页最多 24/48/96 个真实点阵(在“每页数量”下拉框切换),不会在后台自动生成整个字符集。未生成时会显示空状态和下一步操作;尚未选择字体时,可直接点击“去选择字体”返回单字工作区。
“预览字符集”与单字打样、导出使用同一份配置,可在整批页直接切换标准字符集,或修改 Unicode 范围、代码页范围和自定义字符文本,无需返回上一 Tab。修改后字符总数和分页会立即更新,旧字阵会隐藏并提示重新检查,避免误把旧结果当作新字符集结果。大字符集可使用上一页/下一页逐页检查,也可在页码框输入页码直接跳转;“每页数量”切换时会保持在当前视野附近的字。定位框支持输入单字、U+ 码点或 0x 原始编码,直达该字所在页并高亮对应卡片。生成中可以取消,参数变化后需重新检查本页。
当前页的缺字、裁切数量会单独统计,也可通过筛选只显示异常字。每张卡片标注 Unicode 码点;标准字符集还会标注 0x 原始编码和全字符集序号,便于与导出的映射表核对。点击任一缩略图会自动切换到“单字打样与导出”Tab,并定位到对应字符的主预览,便于继续调整字号、点阵和偏移。统计与筛选只代表已检查的当前页,不代表整个字符集均已完成验收。下图示例:新宋体加载后字体检测建议自动应用为 GB2312 汉字区,第 1 页 48 个汉字(啊~靶)排满网格,分页栏显示共 6,768 字、141 页。
图 6|整批检查:GB2312 第 1 页 48 字
文本效果预览:先确认文案能显示
整批预览下方新增“文本效果预览”栏:在输入框粘贴界面文案(最多 200 字),点击“生成文本预览”,工具按当前字符集与取模参数逐字渲染真实点阵。重复出现的字只渲染一次;修改字符集或取模参数后需重新生成。
统计行给出“范围外”和“字体缺字”数量:不在当前导出字符集内的字加红框并计入“范围外”——这些字不会进导出文件,固件上无法显示,应在导出前调整字符集或替换文案;字体本身缺的字单独计入“字体缺字”。下图示例输入“高通字库ABC1”:4 个汉字在 GB2312 汉字区内正常渲染,A、B、C、1 不在导出范围内,全部红框标注。
图 7|文本效果预览:范围外字符红框
7 导出与验收
整批检查通过后,按固件读取约定选择导出方式,并核对 BIN 大小、字符映射、参数记录以及缺字和裁切结果。
导出方式一览
导出区提供四个按钮,输出内容各不相同;除完整 ZIP 外,其余三种只给数据文件,不附映射与参数记录:
| 按钮 | 输出内容 | 适用场景 |
|---|---|---|
| 完整 ZIP(蓝色主按钮) | font.bin + font.c + mapping.csv + manifest.json + README.txt + 可选逐字 PNG | 验收、交接、留档首选;唯一附带字符映射表和参数记录的方式 |
| BIN | 纯点阵流 font.bin(无文件头、无尾注) | 固件侧已有字符映射与读取代码,只需要点阵数据 |
| C 数组 | font.c:同一份 RAW 点阵的 C 源码 | 点阵数据直接编进固件源码工程 |
| LVGL .c(绿色) | LVGL lv_font_t C 源文件:变宽字形 + 码点查找表 | LVGL 工程,LV_FONT_DECLARE 声明后挂到控件 |
单独 BIN 和单独 C 数组不附 mapping.csv / manifest.json。需要核对字符顺序和参数时,应保留完整 ZIP,不要只转发 BIN。
完整 ZIP:本手册教学示例
- 恢复“自定义字符文本”为
高通字库ABC1,输出位深为1bpp。 - 确认字号与点阵均为 24,自动居中开启,阈值为 100。
- 按目标固件选择“横向扫描”和
MSB first。 - 逐字检查缺字与裁切提示。缺字会保留固定长度槽位,并在 CSV / manifest 中标记;不要仅凭预览猜测导出内容。
- 勾选“ZIP 包含逐字 PNG(最多 256 字符)”。
- 阅读授权条款,确认有权取模和再分发后,勾选授权自查。
- 点击“完整 ZIP”,解压验收。
图 8|完整 ZIP 实测检查单
整库导出实测:从 8 字示例到 GB2312 全集
前面教学示例的 8 字 / 576 B 只是完整流程演示,不是工具的规模上限。为回答“这个工具能不能做整库”,本地用思源黑体 CN Regular 对 GB2312 汉字区全集做了三组真实导出(自动应用检测建议后直接导出 BIN):
| 参数 | 有效字符 | font.bin | 生成耗时 | 缺字 | 裁切 |
|---|---|---|---|---|---|
| 16×16 · 1bpp | 6,768 | 216,576 B(约 211 KiB) | 0.8 s | 5 | 884 |
| 24×24 · 1bpp | 6,768 | 487,296 B(约 476 KiB) | 0.8 s | 5 | 5 |
| 24×24 · 4bpp | 6,768 | 1,949,184 B(约 1.86 MiB) | 0.8 s | 5 | 5 |
三点真实观察,供整库打样时参考:
- 规模与速度:6,768 字整库导出在本机 Chrome 中每次不到 1 秒,全部在浏览器本地完成;页面标称单次上限 50,000 字符 / 128 MiB 点阵,本次验证到 6,768 字 / 约 1.9 MiB,未把标称上限当作已验证结论。
- 缺字 5 个:思源黑体对 GB2312 汉字区 99.9% 覆盖,缺字按约定保留固定长度槽位并写入 CSV / manifest,不要按“字节数 ÷ 单字字节”反推字符数。
- 16×16 档 884 字裁切:思源黑体 16 Pixel 字形的边界盒常略超 16×16 画布,属“字号与点阵同尺寸”时的常见现象;这些字仍可导出,但边缘笔画有损失。对笔画完整性有要求时放大一档点阵即可——24×24 档同一字体仅 5 字裁切。这正是第 6 章“整批检查”要逐页核对裁切统计的原因。
导出验收清单
| 检查项 | 本手册实测结果 |
|---|---|
font.bin | 576 B,纯点阵,无文件头、无尾注 |
font.c | 包含同一份 RAW 点阵数据 |
mapping.csv | 8 条字符记录,含 Unicode、原始编码、偏移、长度、advance、字形度量(box_w、box_h、ofs_x、ofs_y)、缺字和裁切字段 |
manifest.json | glyphCount=8、bytesPerGlyph=72、totalBytes=576、hasHeader=false、hasTrailer=false,另含字体级 fontMetrics(ascender=22、descender=-3,本例 24px 实测) |
| 缺字与裁切 | missingGlyphCount=0、clippedGlyphCount=0 |
| 逐字 PNG | png/ 下 8 张,序号与映射表对应 |
mapping.csv 是核对字符索引的主要文件;manifest.json 是供人工复核和脚本处理的导出参数记录。后者不是 GT-HMI Engine 可直接识别的统一字库描述文件,也不会自动完成地址表、字库注册或固件联调。
度量列是 FreeType 字体原始度量(像素),与 BIN 中按画布输出的通用 RAW 相互独立:advance 为下一字起点相对当前起点的水平距离;box_w、box_h 为字形紧致边界盒尺寸;ofs_x、ofs_y 为基线原点到边界盒左缘 / 上缘的偏移(ofs_y 向上为正)。自动居中只改变点阵在画布内的摆放,不改变这些度量列。默认等宽槽位接入用不到它们;实现变宽排版、按基线对齐或换行计算时,可直接引用。
导出 LVGL 字体
导出区第四个按钮“LVGL .c”输出 LVGL lv_font_t C 源文件:位深跟随“输出位深”选择(1/2/4/8bpp),字形为变宽布局,文件内含字形位图、glyph_dsc 描述表与码点查找表(cmaps),符号名 gt_fontlab_lvgl。把文件加入 LVGL 工程编译,用 LV_FONT_DECLARE(gt_fontlab_lvgl) 声明后即可挂到控件使用。生成完成后,页面顶部提示条给出字符数、点阵字节数与缺字、裁切统计。
图 9|LVGL .c 导出入口
图 10|LVGL .c 本地生成完成提示
与通用 RAW 导出的关系:
- LVGL 导出按 LVGL
lv_font_fmt_txt格式组织数据:变宽字形、基线原点、连续位流按 MSB first 打包,cmaps 含连续段与稀疏段两种条目;槽位宽高、扫描方向、位序、加粗 / 斜体 / 下划线、自动居中等通用 RAW 选项在该导出中不参与。 - 字号超过 296 时页面会提示不支持(对齐 LVGL 字体规格的上限约束)。
- 缺字直接跳过、不占字形序号;空字符(如空格)按 lv_font_conv 惯例处理:1bpp 输出 1×1 空白字形,2/4/8bpp 输出 0×0 零字节字形。
- 文件不包含 kerning 数据;LVGL 侧默认不启用 kerning 时显示效果一致。
栅格化对齐的验证边界(如实说明):我们用 lv_font_conv 参考实现做了同字体、同参数(SimHei 16px、95 个 ASCII 字符 + 2 个汉字,共 97 字形)的逐字节交叉验证——2/4/8bpp 的字形描述表、位图字节、行度量和下划线参数与 lv_font_conv 完全一致;1bpp 存在个别字符边缘像素的 bit 级差异,原因是两者所带 FreeType 版本不同(本工具为 FreeType 2.13.3,lv_font_conv 发行包为 2017–2019 年构建)在单色自动微调下的栅格差异,不是格式错误。接入前仍建议在自己的工程里显示实际文案确认效果。
8 固件接入
BIN 和 C 数组提供点阵数据,目标工程仍需按映射实现字符索引与读取,并完成仿真或真机验证。
- 按映射表索引字符,不要把 BIN 文件长度当作字符数,也不要假设存在地址表。
- 核对扫描方向、位序、位深、每字字节数和补零方式;先在仿真或真机上验证 ASCII、中文、缺字和边界字符。
- 接入 GT-HMI Engine 时,阅读《GT-HMI Engine 用户手册》高通字库与自有字库章节,区分普通控件与 GT-MD 两条注册链路,不套用未经验证的灰度读取代码。
- 查询字符编码可使用字符编码在线查询工具;需要桌面工具时访问GT-FontLab Lite 与字库工具。
- GT-FontLab Plus 与 Windows 桌面版渲染引擎不同,量产前仍要验证目标设备效果。
接入 GT-HMI Engine:参数与示例的对应关系
GT-HMI Engine 的自有字库是公开接口:普通控件走 gt_custom_register_font,GT-MD 走 gt_latex_font_register 与 gt_latex_render_register,两条链路独立、注册接口不要混用。以 Engine 手册 9.5.1 的 1bpp 示例为例,本工具导出包与示例回调宏的对应关系如下:
| Engine 示例宏 | 示例值 | 本工具对应位置 |
|---|---|---|
MY_FONT_WIDTH / MY_FONT_HEIGHT | 16 / 16 | 导出参数中的点阵宽、点阵高 |
MY_FONT_BYTES | 32(16×16÷8) | manifest.json 的单字字节数;2/4/8bpp 按位深重算 |
MY_FONT_FIRST / MY_FONT_LAST | 0x20 / 0x7E | 字符集首末 Unicode 码点,mapping.csv 可查每个字符的码点与序号 |
| 回调中的槽位偏移 | (code − FIRST) × BYTES | 连续排列、定长槽位、无文件头的通用 RAW 布局 |
- Engine 示例约定的"码点连续排列、每字定长"布局与本工具 1bpp 通用 RAW 一致:把示例中的
my_font_bin换成本工具导出的 C 数组内容,或把 BIN 放入自己的 Flash 文件系统后按同样偏移读取。 - 2/4/8bpp 灰度导出接入时,须按 Engine 手册说明同步调整数据生成与读取函数。本工具输出的是通用 RAW,不是 GT 字库芯片或 GT-HMI Designer2 的自制字库格式,也不宣称与它们的读取约定兼容。
- 完整接口签名、
gt_conf.h配置与 GT-MD 链路示例见《GT-HMI Engine 用户手册》字库章节。 - 字符规模、语言覆盖或字号需求增长时,先阅读本手册“9 后续字库方案”,再评估标准字库芯片与自定义字库芯片。
9 后续字库方案
自动取模适合原型和小范围固定字符,但产品级字库还可能需要小字号笔画精修、多语言覆盖、多字号一致性和目标屏幕验证。
- 少量固定字符且愿意维护映射与读取代码,可继续使用 GT-FontLab Plus 或 GT-FontLab Lite。
- 希望减少字库制作与维护,可评估标准字库芯片:先用字库选型表按容量、字号、语言筛选,也可对照旧版列表型选型表逐型号查看,两种视图数据一致。
- 需要特定字体、字符集、字号或多语言组合,可评估自定义字库芯片与专业支持。
也要清楚边界:专业字库厂商提供的是专业授权的点阵、灰度和矢量字库,字形完整性、多语言一致性和授权合规由字库方背书,这是 GT-FontLab Plus 自助导出不具备的。工具导出适合原型验证与小批量固定字符;量产选型时,把授权合规与长期维护一并计入。
10 常见问题
为什么点击系统字体没有反应?
确认浏览器支持 Local Font Access、当前为安全上下文,并通过用户操作完成授权;仍不可用时改用 TTF/OTF 文件。
为什么切到 GB2312 后英文没有一起导出?
GB2312 汉字区不会自动附加 ASCII。检查有效字符范围,必要时使用自定义字符文本。
为什么阈值输入框不能修改?
当前为 2 / 4 / 8bpp 时阈值不适用;切回 1bpp 后再进行二值化阈值比较。
为什么自动居中后仍然裁切?
自动居中只按现有非空位图边界调整位置,不会缩小字形。减小字号、增大点阵或调整偏移。
是否可以不联网完成全部工作?
首次打开仍需下载页面和 JS/WASM。页面、程序和字体均加载后,后续生成不需要服务器;本次回归验证了生成零 HTTP 请求及断网 C 数组导出,不代表冷启动离线可用。
是否支持复杂文字组合与重排?
当前按 Unicode code point 逐字取模,不是完整复杂文字 shaping 或双向排版引擎。

