Jim 的 QR 字体直接使用 OpenType 特性从文本生成 QR 码
Jim 的 QR 字体直接从文本生成 QR 码,使用 OpenType 特性
概述
Jim 的 QR 字体是一个实验性的 TrueType/OpenType 字体,它将方括号包围的 ASCII 字符串转换为 QR 码字形,同时正常渲染其余文本。该技术依赖于 OpenType GSUB 特性,使得 QR 生成可以直接在文本布局引擎中完成。
字体工作原理
- 字体将被
[和]包围的文本解析为 QR 码负载。 - 仅接受可打印的 ASCII 字符;负载长度受字体变体限制(17、32 或 53 个字符)。
- 生成器使用字节模式、固定掩码模式(0)和 Reed‑Solomon 错误纠正来构建 QR 码。
- QR 模块的字形轮廓通过程序生成;其余可打印的 ASCII 字形则从 Liberation Sans Regular 复制并缩放以匹配字体的 em 方块。
- 最终的字体系列命名为 QR Font 1‑L、QR Font 2‑L 和 QR Font 3‑L,以避免与原始 Liberation 字体的命名冲突。
"所有字体使用:字节模式、可打印 ASCII 输入、固定掩码模式 0、
[和]作为分隔符" – 项目 README。
可用字体变体
| 变体 | 模块网格 | 最大字符数 |
|---|---|---|
qrfont-1L.ttf |
21 × 21 | 17 |
qrfont-2L.ttf |
25 × 25 | 32 |
qrfont-3L.ttf |
29 × 29 | 53 |
每个变体均以 TrueType 文件形式分发在 GitHub 发布页面。更大的网格支持更长的负载,但会产生更大的可视 QR 符号。
构建字体
仓库提供了 Makefile 和基于 uv 管理的 Python 构建流水线。默认的 make 目标执行完整构建,包含 Reed‑Solomon 奇偶校验电路,生成数千个上下文查找。若需更快迭代,可通过 make fast-placeholder 进行仅布局的占位零奇偶构建。
典型构建步骤:
# Install uv (if not already installed)
curl -LsSf https://astral.sh/uv/install.sh | sh
# Build the fonts (full parity)
make
# Or a faster placeholder build
make fast-placeholder
生成器期望在 /usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf 处找到 Liberation Sans Regular。也可以提供其他基础字体:
uv run tools/build_font.py --base-font /path/to/YourBaseFont-Regular.ttf
生成的产物:
dist/qrfont-*.ttf– 三个字体文件。dist/index.html– 交互式演示页面。build/qrfont-*.fea– 生成的 OpenType 特性文件。
使用字体
- 在系统上安装生成的
.ttf文件之一。 - 打开演示页面(
dist/index.html)或任何支持 OpenType 成形的应用程序(例如现代浏览器、文字处理器或代码编辑器)。 - 输入普通文本并混合使用方括号包围的负载,例如
abc[hello]ghi。 - 周围字符使用基础字形渲染,而方括号段则显示为 QR 码。
"混合文本如
abc[def]ghi应渲染为普通文本,然后是def的 QR 码,随后是普通文本。" – README。
技术细节
- 字节模式 – QR 生成器将每个 ASCII 字符编码为单个字节,简化转换。
- 固定掩码模式 0 – 使用常量掩码消除运行时掩码选择的需求,这在静态字体中是不可能的。
- Reed‑Solomon 奇偶 – 通过一系列 OpenType 上下文查找实现,使错误纠正数据直接嵌入字形流。
- GSUB 特性逻辑 – 构建脚本输出替换特性,将分隔符序列和负载替换为相应的 QR 模块字形。
限制
- 字体仅在应用 GSUB 特性的环境中工作;忽略 OpenType 成形的纯文本渲染器会将分隔符和负载显示为普通字符。
- 负载长度受模块网格限制(17、32 或 53 个字符)。
- 仅支持可打印的 ASCII;Unicode 字符不被编码。
- 该字体是概念验证,非生产使用。
许可证
生成的字体是 Liberation Sans Regular 的 修改版,在 SIL Open Font License v1.1 下分发。完整条款请参见仓库中的 LICENSE-OFL.txt 和 NOTICE.md。
结论
Jim 的 QR 字体展示了利用 OpenType 成形在文本流中直接嵌入功能性 QR 码的创新用法。通过将方括号包围的 ASCII 转换为 QR 字形,项目证明了可以完全在字体内部实现复杂数据编码,为 Web 和桌面环境中的轻量、免代码 QR 生成打开了可能性。