Jim의 QR 폰트는 OpenType 기능을 사용해 텍스트에서 직접 QR 코드를 생성합니다
Jim의 QR 폰트는 OpenType 기능을 사용해 텍스트에서 직접 QR 코드를 생성합니다
개요
Jim의 QR 폰트는 괄호([와 ])로 구분된 ASCII 문자열을 QR‑코드 글리프로 변환하고, 나머지 텍스트는 일반적으로 렌더링하는 실험적인 TrueType/OpenType 폰트입니다. 이 기술은 OpenType GSUB 기능에 의존하여 텍스트 레이아웃 엔진에서 바로 QR 생성이 가능하도록 합니다.
폰트 작동 방식
- 폰트는
[와]사이에 있는 텍스트를 QR‑코드 페이로드로 파싱합니다. - printable ASCII 문자만 허용되며, 페이로드 길이는 폰트 변형에 따라 제한됩니다(17, 32, 또는 53 문자).
- 생성기는 바이트 모드, 고정 마스크 패턴(0), Reed‑Solomon 오류 정정을 사용해 QR 코드를 만듭니다.
- QR 모듈의 글리프 윤곽은 프로그래밍 방식으로 출력되고, 주변 printable ASCII 글리프는 Liberation Sans Regular에서 복사해 폰트의 em 스퀘어에 맞게 스케일링합니다.
- 완성된 폰트 패밀리 이름은 원본 Liberation 폰트와의 충돌을 피하기 위해 QR Font 1‑L, QR Font 2‑L, QR Font 3‑L 로 지정되었습니다.
"모든 폰트는 다음을 사용합니다: 바이트 모드, Printable ASCII 입력, 고정 마스크 패턴 0,
[와]를 구분자로 사용" – 프로젝트 README.
사용 가능한 폰트 변형
| 변형 | 모듈 그리드 | 최대 문자 수 |
|---|---|---|
qrfont-1L.ttf |
21 × 21 | 17 |
qrfont-2L.ttf |
25 × 25 | 32 |
qrfont-3L.ttf |
29 × 29 | 53 |
각 변형은 GitHub 릴리스 페이지에서 TrueType 파일로 배포됩니다. 그리드가 클수록 더 긴 페이로드를 지원하지만 시각적인 QR 심볼이 커집니다.
폰트 빌드하기
레포지토리에는 Makefile과 uv 로 관리되는 Python 기반 빌드 파이프라인이 포함되어 있습니다. 기본 make 타깃은 Reed‑Solomon 패리티 회로를 포함한 전체 빌드를 수행해 수천 개의 컨텍스트 룩업을 생성합니다. 빠른 테스트를 위해 자리표시자 제로 패리티만 사용하는 레이아웃‑전용 빌드를 make fast-placeholder 로 실행할 수 있습니다.
Typical build steps:
# 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 코드로 표시됩니다.
"
abc[def]ghi와 같은 혼합 텍스트는 일반 텍스트, 그 다음def에 대한 QR 코드, 그리고 다시 일반 텍스트 순으로 렌더링되어야 합니다." – README.
기술 상세
- Byte Mode – QR 생성기는 각 ASCII 문자를 단일 바이트로 인코딩해 변환을 단순화합니다.
- Fixed Mask Pattern 0 – 고정 마스크를 사용하면 런타임에 마스크를 선택할 필요가 없으며, 정적 폰트에서는 이것이 불가능합니다.
- Reed‑Solomon Parity – OpenType 컨텍스트 룩업 시리즈로 구현되어 오류 정정 데이터를 글리프 스트림에 직접 삽입합니다.
- GSUB Feature Logic – 빌드 스크립트는 구분자 시퀀스와 페이로드를 적절한 QR‑모듈 글리프로 교체하는 substitution feature 를 출력합니다.
제한 사항
- 폰트는 GSUB 기능을 적용하는 환경에서만 동작합니다. OpenType shaping을 무시하는 일반 텍스트 렌더러에서는 구분자와 페이로드가 일반 문자로 표시됩니다.
- 페이로드 길이는 변형의 모듈 그리드에 의해 제한됩니다(17, 32, 또는 53 문자).
- printable ASCII만 지원되며, Unicode 문자는 인코딩되지 않습니다.
- 이 폰트는 개념 증명용이며 실제 제품에 사용하기 위한 것이 아닙니다.
라이선스
생성된 폰트는 Liberation Sans Regular 의 Modified Version이며 SIL Open Font License v1.1 하에 배포됩니다. 전체 조건은 레포지토리의 LICENSE-OFL.txt 와 NOTICE.md 를 참고하십시오.
결론
Jim의 QR 폰트는 OpenType shaping을 활용해 텍스트 스트림에 기능적인 QR 코드를 직접 삽입하는 창의적인 사용 사례를 보여줍니다. 괄호로 구분된 ASCII를 QR 글리프로 변환함으로써 복잡한 데이터 인코딩을 폰트만으로 완전히 구현할 수 있음을 증명하고, 웹 및 데스크톱 환경에서 경량·코드‑프리 QR 생성의 가능성을 열어줍니다.