墨穗app.notebase.cn
控制台
内容库
动态
管理
账户
U
用户
--
在线
v1.0.165 · 墨穗笔记
笔记

Notebase墨穗
静水流深,落墨成穗。

0笔记
0工具
30推荐

分类导航

按主题直达

编辑精选

站内用户贡献 · 真实笔记

最新收录

每日更新
继续浏览全部内容 →

笔记

0
加载中...

工具

0

此页用于记录用户反馈问题后的每一次改进

关于

笔记用法

“写笔记”支持四种格式——Word 文档、Excel 表格、Markdown、纯文本,起稿或二次编辑时都能随时切换,同一篇笔记想用哪种形态来记,都由你说了算。

md、txt、csv、json 这类纯文本则原样载入,不做多余加工。拿一张现成的表倒进来、改几笔、再导出去,等于白用一台免费的格式转换器。

要带走就在右上角点“下载”,可导出 PDF、Word、Markdown、Excel、TXT 等格式;列表卡片“⋯”菜单里,也有同样的下载入口。

工具用法

在“工具”页点“+ 上传工具”即可发布:填好名称与链接,再用 Markdown 把使用方法写清楚——能解决什么问题、怎么装、怎么用,比堆介绍实在。

要分发安装包就一并上传压缩包(ZIP、RAR、7Z、TAR.GZ,最大 35MB),别人在详情页一键下载;只放链接不带附件也可以。

工具按大家的收藏热度排序,好用的自然会被顶上来。发布后可在详情页或卡片菜单里编辑、下架。

隐藏笔记

写笔记时勾上“隐藏”,这篇就只存在于你自己的账号里:不进列表、不进搜索、不上首页精选,也不会出现在任何公开的页面,链接发给别人同样打不开。

适合放密码、草稿、日记这类只给自己看的内容;想公开,去“发布”打开它,把“隐藏”的勾去掉再保存,之后编辑会默认保持原状态,不会悄悄变回公开。

不想公开、只想临时给人看:点“分享”生成一条带密码和有效期的链接,到期自动失效,你也能随时撤销。

数据安全

你的内容会同时保存在多个副本上,系统定期做备份与完整性校验,再配合异地容灾机制:就算某台机器出问题,数据也不会丢,可以长期放心存放;特别重要的资料,仍建议你另外再留一份备份。

技术

全站跑在容器化、模块化的现代架构上,更新、部署、回滚都很快,扩展性和稳定性都按长期运营的标准来设计(Built for reliability, designed to scale)。

理念

这个网站最早只是一个人的笔记仓库,后来慢慢长成现在的知识中枢。设计上很克制——没有广告、没有追踪、没有推荐算法,只是干干净净地存放一些东西;既然做好了,就公开出来,万一有人用得上呢。

原则

不做大而全,不做平台梦,保持简单、保持克制、保持好奇。所有内容都由用户贡献、由用户维护:不会突然冒出付费墙,不会在角落塞广告位,也不会把你的数据卖给第三方。

更多

产品会持续迭代,站内日志页记录着每一次改动,改了什么都有迹可循;想了解这个站是怎么一步步走到今天的,翻翻日志就能看到来龙去脉。

举报

如果在这里看到涉嫌违规的内容,点对应卡片右侧的“举报”按钮就能提交,我们会尽快核实处理;也谢谢你花一点时间,一起把这里维护干净。

趋势

// 点击导航加载发现
归档
// 归档为空
最近浏览
// 暂无浏览记录
发布
// 加载中...
用户发布
// 加载中...
用户管理
// 加载中...
访问统计
// 加载中...
内容审核
// 加载中...
个人信息
// 加载中...
返回首页

在字体中嵌入二维码生成器:Jim's TrueType QR Code Font 技术解析

2026-07-08编程开发

本文介绍一个实验性项目:通过 OpenType 字体中的 GSUB 特性,将方括号内的文本实时渲染为二维码,同时保留周围普通文本的正常显示。

项目概述

Jim Paris 开发的 qr-font 是一个生成实验性 OpenType 字体的工具。该字体能够将方括号 [...] 包裹的文本自动转换为 QR Code 符号,而括号外的文本正常显示。例如,输入 abc[hello]ghi,字体渲染后会在 abc 和 ghi 之间呈现一个包含 "hello" 信息的二维码。

项目提供三种字体版本,分别对应不同容量的 QR 码:

  • qrfont-1L.ttf:21×21 模块,最多 17 个字符
  • qrfont-2L.ttf:25×25 模块,最多 32 个字符
  • qrfont-3L.ttf:29×29 模块,最多 53 个字符

所有字体均使用:

  • 字节模式(Byte mode)编码
  • 可打印 ASCII 字符输入
  • 固定掩模模式 0(Fixed mask pattern 0)
  • 方括号 [ 和 ] 作为定界符

技术原理:字体如何变成二维码生成器?

不是手写字体,而是程序生成的字形

传统字体是设计师手绘或数字化的字形集合。而 qr-font 的字形完全由构建脚本自动生成。构建流程包括:

  1. 解析定界符:识别文本中的 [...] 区域
  2. 字节扩展:将输入文本转换为 QR 码所需的字节序列
  3. 里德-所罗门纠错电路:生成纠错码(Reed-Solomon parity)
  4. QR 模块布局:将数据与纠错码按 QR 规范排列成矩阵
  5. 固定掩模渲染:应用掩模模式 0 并输出最终字形轮廓

核心技术:OpenType GSUB 特性

OpenType 字体规范中的 GSUB(Glyph Substitution,字形替换) 表通常用于实现连字、上下文替换等排版功能。例如,fi 连字会将 'f' 和 'i' 两个独立字形替换为一个 'fi' 字形。

qr-font 将这一机制推向了极致:

  • 构建脚本生成大量的 上下文查找规则(contextual lookups),这些规则定义了当输入字符序列匹配 [内容] 模式时,如何将其替换为预先计算好的 QR 码字形。
  • 每个 QR 码版本(1-L、2-L、3-L)对应一组不同的 GSUB 规则。
  • 完整的里德-所罗门纠错电路会生成数千条查找规则,这也是完整构建(make full-parity)耗时较长的原因。

为什么需要 OpenType 整形引擎?

该字体依赖于 OpenType shaping(整形)引擎来应用 GSUB 特性。这意味着:

  • 它不能在简单的文本渲染器(如某些终端或图片库)中工作
  • 需要支持 OpenType 布局的渲染环境,如:
    • 现代浏览器(Chrome、Firefox、Safari)
    • LibreOffice、Microsoft Word 等办公软件
    • 支持 HarfBuzz 的排版引擎

普通文本的来源:Liberation Sans

字体中可打印 ASCII 字符的字形直接取自 Liberation Sans Regular(一款与 Arial 兼容的自由字体),并按比例缩放到 QR 字体的 em-square 中。因此,方括号外的文本会以 Liberation Sans 的样式正常显示。

由于 Liberation Sans 的许可证(SIL Open Font License)将 "Liberation" 列为保留字体名称,生成的字体家族被命名为 QR Font 1-L、QR Font 2-L、QR Font 3-L。

构建与使用

环境要求

  • Python 3.x
  • uv(Python 包管理工具)
  • Liberation Sans Regular 字体(通常位于 /usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf)

快速构建

bash
make

或直接运行:
bash
uv run tools/build_font.py

自定义基础字体

bash
uv run tools/build_font.py --base-font /path/to/BaseFont-Regular.ttf

构建模式

  • 完整纠错构建(默认):make full-parity,生成包含完整里德-所罗门纠错码的字体,耗时较长
  • 快速占位构建:make fast-placeholder,仅生成布局,纠错码用零填充,适合调试

生成文件

  • dist/qrfont-*.ttf:三种版本的字体文件
  • dist/index.html:交互式 Web 演示页面
  • build/qrfont-*.fea:生成的 OpenType 特性文件(.fea 格式)

调试工具

bash
uv run tools/shape_debug.py ' [a] ' ' [b] '

该工具可以显示字形替换后的字形流,帮助开发者理解 GSUB 规则的执行结果。

限制与注意事项

  1. 概念验证性质:这是一个实验性项目,并非生产就绪的解决方案
  2. 输入限制:QR 块内的输入必须是可打印 ASCII 字符,长度受版本限制(17、32、53)
  3. 渲染环境依赖:必须使用支持 OpenType shaping 的软件
  4. 性能考虑:完整纠错构建会生成数千条 GSUB 规则,字体文件较大且构建耗时

背后的技术挑战

里德-所罗门纠错码的字体实现

QR 码使用里德-所罗门码(Reed-Solomon codes)实现纠错。在传统实现中,这是一个数学计算过程。但在字体中实现时,需要将纠错计算转化为字形替换规则——即预先计算所有可能的输入组合对应的纠错码,然后通过 GSUB 规则在渲染时匹配替换。

对于 1-L 版本(最多 17 个字符),可能的输入组合数量巨大,但项目通过限制输入为可打印 ASCII 并固定版本和纠错级别,使预计算成为可能。

掩模模式的固定

QR 码规范定义了 8 种掩模模式(mask patterns),用于优化二维码的可读性。该项目固定使用掩模模式 0,简化了字体生成逻辑。这意味着生成的二维码可能不是最优可读的,但功能完整。

实际应用场景

虽然这是一个实验性项目,但它展示了字体技术的边界:

  • 自动生成二维码:在文档或网页中,只需输入带方括号的文本,即可自动生成二维码
  • 教育用途:帮助理解 OpenType 特性和 QR 码原理
  • 创意排版:为印刷品或电子文档添加动态二维码元素

许可证

生成的字体是 Liberation Sans Regular 的修改版本,遵循 SIL Open Font License 1.1。详见项目中的 LICENSE-OFL.txt 和 NOTICE.md。

总结

Jim's TrueType QR Code Font 是一个极具创意的技术实验,它打破了字体只能显示静态文本的传统认知,将二维码生成逻辑嵌入到字体的 GSUB 特性中。虽然受限于 OpenType shaping 的兼容性和输入长度,但它为字体技术的应用提供了一个全新的视角。对于对字体工程、二维码原理或实验性编程感兴趣的技术人员,这是一个值得深入研究的项目。

原文链接:https://github.com/jimparis/qr-font

相似推荐
uBlock Origin 开发版被 Chrome 商店拒绝:一场关于扩展单一用途政策的争议逆向工程实战:我如何绕过亚马逊Kindle网页端的DRM加密Heroku的丑陋秘密:云之王如何背离Rails并欺骗客户Firefox 成为最后一个支持 uBlock Origin 的主流浏览器:广告拦截的终局之战GitHub Codespaces 深度解读:云端开发环境如何重塑编码工作流认知负荷才是关键:软件设计的根本度量
编写使用方法
Markdown 格式 · Ctrl+Enter 确定
0 字新建笔记
欢迎回来
登录你的墨穗笔记账户
忘记密码?
还没有账户?立即注册
创建账户
注册你的专属墨穗笔记
已有账户?去登录
找回密码
输入注册邮箱获取验证码
返回登录
请输入图片中的验证码以继续注册
加载中...
取消
新建收藏
手动添加你喜欢的内容
取消
编辑头像与昵称
上传新头像或修改你的显示昵称
支持 JPG/PNG,最大 2MB
取消

问题反馈

隐私提醒

取消
编辑工具
受控分享
为这篇笔记生成限时 / 带密码的临时链接
关闭