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‑LQR Font 2‑LQR 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 特性文件。

使用字体

  1. 在系统上安装生成的 .ttf 文件之一。
  2. 打开演示页面(dist/index.html)或任何支持 OpenType 成形的应用程序(例如现代浏览器、文字处理器或代码编辑器)。
  3. 输入普通文本并混合使用方括号包围的负载,例如 abc[hello]ghi
  4. 周围字符使用基础字形渲染,而方括号段则显示为 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.txtNOTICE.md


结论

Jim 的 QR 字体展示了利用 OpenType 成形在文本流中直接嵌入功能性 QR 码的创新用法。通过将方括号包围的 ASCII 转换为 QR 字形,项目证明了可以完全在字体内部实现复杂数据编码,为 Web 和桌面环境中的轻量、免代码 QR 生成打开了可能性。

Sources