Wrasse

Published

How QR codes encode your data

A short technical look at QR encoding modes, error correction levels, and version sizes — so you can make smarter choices about what to put in your QR codes.

QR has 4 encoding modes

QR codes don't store characters; they store bits. The encoder picks one of four modes — Numeric, Alphanumeric, Byte, or Kanji — based on what you fed it. Numeric is densest (~3 chars per 10 bits). Alphanumeric covers uppercase A–Z, digits, and a few punctuation marks. Byte (the catch-all) takes 8 bits per byte and is what URL/text/email/most-things uses. Kanji is special-cased for Shift JIS encoded Japanese.

Error correction: L, M, Q, H — and why H costs 30% capacity

Reed-Solomon error correction lets a QR survive damage, occlusion, or a logo in the middle. Level L tolerates ~7% loss; M ~15%; Q ~25%; H ~30%. Higher EC means more correction codewords, which means less room for actual data. Wrasse defaults to M (the sweet spot) and auto-bumps to H when you embed a logo so the modules under the logo are recoverable.

Versions 1 to 40: when your QR gets bigger

QR comes in 40 size versions. Version 1 is 21×21 modules and holds about 17 alphanumeric characters at EC M. Version 10 is 57×57 and holds 311. Version 40 is 177×177 and holds 1,852. The encoder picks the smallest version that fits your payload — so a longer URL silently produces a larger, denser QR with smaller modules. At some point the modules become too small to scan reliably under poor lighting.

Why URL shorteners help (and why dynamic QR replaces them)

A 200-character URL forces a higher version with smaller modules. Run it through a shortener and you get a ~25-character URL that fits in a smaller, scannable QR. Wrasse's Phase 2 dynamic QR is essentially an integrated shortener with branded URLs (qr.tsuchiyalab.com/q/abc) plus analytics, plus the ability to repoint the destination after the QR is printed.

Make smarter QR decisions in Wrasse

We surface the practical knobs — EC level (L/M/Q/H), input length limits, logo size cap (40% of width) — and bake the trade-offs into the validation. The form refuses payloads that won't produce a usable QR before you waste time. The encoder picks the version; you focus on the content.