Jim's QR Font 使用 OpenType 特性直接從文本生成 QR Code
Jim's QR Font 使用 OpenType 特性直接從文本生成 QR Code
概述
Jim's QR Font 是一款實驗性的 TrueType/OpenType 字體,它能將括號分隔的 ASCII 字串轉換為 QR Code 字形,同時正常渲染其餘文本。此技術依賴 OpenType GSUB 特性,使得直接在文本佈局引擎中生成 QR Code 成為可能。
字體運作原理
- 字體會將由
[和]包圍的文本解析為 QR Code 載荷(payload)。 - 僅接受可列印的 ASCII 字元;載荷長度受限於字體變體(17、32 或 53 個字元)。
- 生成器使用位元組模式(byte mode)、固定遮罩模式(0)以及 Reed-Solomon 錯誤修正來構建 QR Code。
- QR 模組的字形輪廓是透過程式化方式產生的;周圍的可列印 ASCII 字形則從 Liberation Sans Regular 複製並縮放以符合字體的 em square。
- 生成的字體系列命名為 QR Font 1-L、QR Font 2-L 和 QR Font 3-L,以避免與原始的 Liberation 字體產生命名衝突。
"All fonts use: Byte mode, Printable ASCII input, Fixed mask pattern 0,
[and]as delimiters" – project README.
可用的字體變體
| Variant | Module Grid | Max Characters |
|---|---|---|
qrfont-1L.ttf |
21 × 21 | 17 |
qrfont-2L.ttf |
25 × 25 | 32 |
qrfont-3L.ttf |
29 × 29 | 53 |
每個變體都以 TrueType 檔案的形式發佈在 GitHub releases 頁面。較大的網格支援更長的載荷,但代價是視覺上的 QR 符號會變得更大。
建置字體
該儲存庫提供了一個 Makefile 和一個由 uv 管理的 Python 建置流程。預設的 make 目標會執行完整的建置,包括 Reed-Solomon 奇偶校驗,從而生成數千個上下文查找(contextual lookups)。為了更快速地迭代,也可以透過 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 shaping 的應用程式(例如:現代瀏覽器、文書處理器或程式碼編輯器)。 - 輸入混合了括號載荷的普通文本,例如
abc[hello]ghi。 - 周圍的字元會以基礎字形渲染,而括號內的片段會顯示為 QR Code。
"Mixed text such as
abc[def]ghishould render as normal text, then a QR code fordef, then normal text." – README.
技術細節
Byte Mode – QR 生成器將每個 ASCII 字元編碼為單個位元組,簡化了轉換過程。
Fixed Mask Pattern 0 – 使用固定遮罩可以消除對執行時遮罩選擇的需求,這在靜態字體中是不可能的。
Reed-Solomon Parity – 以一系列 OpenType 上下文查找的形式實現,使得錯誤修正數據可以直接嵌入在字形流中。
GSUB Feature Logic – 建置腳本會發佈一個替換特性,將分隔符序列與載荷替換為相應的 QR 模組字形。
限制
- 字體僅在應用於 GSUB 特性的環境中運作;忽略 OpenType shaping 的純文本渲染器將會顯示分隔符與載荷為普通字元。
- 載荷長度受限於變體的模組網格(17、32 或 53 個字元)。
- 僅支援可列印的 ASCII;不支援 Unicode 字元編碼。
- 此字體是概念驗證,並非設計用於生產環境。
授權
生成的字體是 Liberation Sans Regular 的 Modified Version,並根據 SIL Open Font License v1.1 發佈。請參閱儲存庫中的 LICENSE-OFL.txt 和 NOTICE.md 以獲取完整條款。
結論
Jim's QR Font 展示了 OpenType shaping 的創意用法,透過將括號內的 ASCII 轉換為 QR Code 字形,該專案展示了複雜的數據編碼可以在完全在字體內完成,為網頁與桌面環境中輕量化、無需程式碼的 QR Code 生成提供了可能性。