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-LQR Font 2-LQR 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 特性檔案。

使用字體

  1. 在您的系統上安裝其中一個生成的 .ttf 檔案。
  2. 開啟示範頁面 (dist/index.html) 或任何支援 OpenType shaping 的應用程式(例如:現代瀏覽器、文書處理器或程式碼編輯器)。
  3. 輸入混合了括號載荷的普通文本,例如 abc[hello]ghi
  4. 周圍的字元會以基礎字形渲染,而括號內的片段會顯示為 QR Code。

"Mixed text such as abc[def]ghi should render as normal text, then a QR code for def, 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.txtNOTICE.md 以獲取完整條款。


結論

Jim's QR Font 展示了 OpenType shaping 的創意用法,透過將括號內的 ASCII 轉換為 QR Code 字形,該專案展示了複雜的數據編碼可以在完全在字體內完成,為網頁與桌面環境中輕量化、無需程式碼的 QR Code 生成提供了可能性。

Sources