QRコードは何文字まで入るのか — 表を覚えずに符号化して測る
QRコードに何文字入るかを調べると、7089 という数字が出てくる。だがこれは「数字だけを、誤り訂正レベルLで、最大の型番に詰めたとき」の値だ。日本語を混ぜた瞬間に4分の1以下になる。
条件が4つ(符号化モード・誤り訂正レベル・型番・データ)も掛かるので、表を覚えても使えない。実際に符号化して境界を測るほうが速い。その方法と、測った値を残しておく。
容量が変わる理由は符号化モードにある
QRコードは中身に応じて符号化の方法を切り替える。1文字あたりに使うビット数がモードごとに違う。
| モード | 対象 | 1文字あたり |
|---|---|---|
| 数字 | 0-9 |
約 3.33 ビット |
| 英数字 | 0-9 A-Z と一部記号(空白 $ % * + - . / :) |
約 5.5 ビット |
| バイト | 上記以外(小文字・記号・UTF-8 の日本語など) | 1バイトあたり 8 ビット |
| 漢字 | Shift_JIS 2バイト文字 | 13 ビット |
英数字モードに 小文字が入っていないのが実務でよく効く。https://EXAMPLE.COM/PATH は英数字モードに収まるが、https://example.com/path は小文字を含むのでバイトモードに落ちる。同じ長さでもデータ量が1.5倍近く変わる。
誤り訂正レベルも効く。L・M・Q・H はそれぞれ約7%・15%・25%・30%の欠損から復元できるが、その訂正用データが同じ符号の中に同居するので、レベルを上げるほど本文に使える領域は減る。
表を引かずに測る
qrcode パッケージの QRCode.create() は、収まらなければ例外を投げ、収まれば型番を返す。この2つがあれば境界は二分探索で出る。
1 | |
大事なのは 足す文字の種類を入力に合わせることだ。数字だけの文字列に a を足すと、その瞬間にバイトモードへ落ちて容量が急に減る。測りたいのは「いまのモードのまま、あと何文字入るか」なので、数字なら 0、英数字なら A、それ以外なら a を足す。
実測値
2026年8月5日に qrcode@1.5.1 で測った。入力は https://hashitosystem.com/tools/qrcapacity/(43文字・すべて ASCII なのでバイトモード)。
| 誤り訂正レベル | 型番 | 一辺 | あと何文字 | 合計 |
|---|---|---|---|---|
| L | 3 | 29 x 29 | 2910 | 2953 |
| M | 4 | 33 x 33 | 2288 | 2331 |
| Q | 4 | 33 x 33 | 1620 | 1663 |
| H | 5 | 37 x 37 | 1230 | 1273 |
合計が 2953 / 2331 / 1663 / 1273 になった。これは規格が定めるバイトモード・型番40の最大容量そのものである。表を見ずに測った値が表と一致したので、この測り方は信用してよい。
注目すべきは左から2列目だ。43文字のURLを入れただけで、Lなら型番3、Hなら型番5になる。型番が2つ上がると一辺のマス数は29から37へ増える。同じ大きさに印刷するなら、1マスあたりの物理サイズが8分の6以下になるということだ。
つまり誤り訂正レベルを上げる判断は、「汚れに強くする」だけの話ではない。マスが細かくなって読み取り自体が難しくなる方向にも効く。名刺のような小さい印刷面では、Hにしたせいで読めなくなることが実際に起きる。
実務での判断
- URL は短くする。 リダイレクタを1つ挟んで
example.com/a1b2にするだけで型番が下がる。パラメータを付けたトラッキングURLをそのままQRにすると、型番が跳ね上がって印刷面積を食う - 大文字にできるなら英数字モードを狙う。 DNS は大小を区別しないので、ホスト名だけでも大文字にすると入る量が変わる。ただしパス部分は大小が区別されるサーバがあるので、そこは変えない
- 誤り訂正レベルは用途で決める。 屋外掲示や汚れる印刷物はQかH、画面表示だけならLかM。迷ったらMでよい
- ロゴを重ねるなら先にHで測る。 中央にロゴを置く運用は誤り訂正の余力を食う。Hにしたぶん型番が上がって読みにくくなっていないか、実機で確認する
この測定をブラウザ上でそのまま試せるツールを QRコード 文字数チェッカー として公開した。文字列を貼り付けると、上の表と同じ内容(レベルごとの型番・一辺のマス数・残り文字数)が出る。符号化も測定もページ内で完結するので、入力した文字列は送信されない。
書き写した容量表は、モードを1つ読み違えるだけで嘘になる。測ったほうが速いし、間違えない。