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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
const QRCode = require('qrcode');

function fits(text, level) {
try { QRCode.create(text, { errorCorrectionLevel: level }); return true; }
catch { return false; }
}

// text の末尾に pad を足していけるだけ足して、限界の1つ手前を返す
function headroom(text, level, pad) {
if (!fits(text, level)) return -1;
let lo = 0, hi = 1;
while (fits(text + pad.repeat(hi), level)) { lo = hi; hi *= 2; } // 上限を掴む
while (lo + 1 < hi) { // 二分探索
const mid = (lo + hi) >> 1;
if (fits(text + pad.repeat(mid), level)) lo = mid; else hi = mid;
}
return lo;
}

for (const level of ['L', 'M', 'Q', 'H']) {
const qr = QRCode.create('https://example.com/', { errorCorrectionLevel: level });
console.log(level, '型番', qr.version, '残り', headroom('https://example.com/', level, 'a'));
}

大事なのは 足す文字の種類を入力に合わせることだ。数字だけの文字列に 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つ読み違えるだけで嘘になる。測ったほうが速いし、間違えない。


QRコードは何文字まで入るのか — 表を覚えずに符号化して測る
https://blog.hashito.biz/2026/08/05/qr-code-character-limit-measure-by-encoding/
著者
hashito
作成日
2026年8月5日
著作権