QR コード

2 次元バーコードの一種。最大 7,089 桁の数字または漢字約 1,800 文字 (バージョン 40 かつ誤り訂正レベル L の場合) を格納でき、誤り訂正機能を持つ。

QR コード (Quick Response Code) は、1994 年にデンソーウェーブが開発した 2 次元バーコードです。もともとは自動車部品の管理用に作られた規格です。従来のバーコードが横方向にしかデータを持たないのに対し、QR コードは縦横の両方向にデータを並べるため、同じ大きさでも桁違いに多くの情報を扱えます。スマートフォンのカメラで読み取るだけで URL にアクセスしたり、決済を完了したりできる手軽さから、世界中で普及しました。

QR コードにはバージョン 1 (21 x 21 モジュール) からバージョン 40 (177 x 177 モジュール) まであり、バージョンが上がるほど多くのデータを格納できます。よく引用される最大容量は、いずれも「バージョン 40 で誤り訂正レベルを最も低い L にした場合」の値で、数字だけなら 7,089 桁、英数字で 4,296 文字、8 ビットのバイト列で 2,953 バイト、漢字 (Shift_JIS) で 1,817 文字です。同じバージョンでも誤り訂正を強めれば容量は減るため、この数字をそのまま実務の上限として当てにはできません。実際には URL や決済トークンなど数十〜数百バイト程度のデータに使われることがほとんどです。

文字種によって容量が違うのは、データを詰めるモードが分かれているからです。数字モードは 3 桁を 10 ビット、英数字モードは 2 文字を 11 ビット、バイトモードは 1 バイトを 8 ビット、漢字モードは 1 文字を 13 ビットで表します。ここで落とし穴になるのが英数字モードの文字集合で、扱えるのは数字と大文字の A から Z、空白、そして $ % * + - . / : の 8 記号だけです。小文字を含む URL は英数字モードに収まらずバイトモードで格納されるため、1 文字あたりのビット数が増えて容量が早く尽きます。

誤り訂正機能は QR コードの大きな特徴です。L (7%)、M (15%)、Q (25%)、H (30%) の 4 段階があり、レベル H なら失われたデータの約 30% を復元できます。この割合はコードワード (データを分割した符号語) の総数に対する比率で、シンボルの面積に対する比率ではありません。同じ広さの汚れでも、どのコードワードにかかるかで復元できるかどうかは変わります。開発元のデンソーウェーブは、通常は M (15%) が最も多く選ばれると説明しています。企業ロゴを中央に置いたデザイン QR コードが成り立つのもこの誤り訂正のおかげですが、ロゴで隠した分だけ訂正能力を先に使ってしまうため、その後の汚れや破れに耐える余力は減ります。レベルを上げれば同じデータでもバージョンが上がり、印刷サイズが同じならモジュール 1 個は小さくなって読み取りにくくなるので、汚れやすさと印刷できる大きさの両方を見て決めることになります。

セキュリティ面では、QR コードの中身が目視で確認できないという弱点があります。正規のコードの上に偽のステッカーを貼るだけで別の URL へ誘導できてしまうため、駐車料金メーターなどの支払い用コードにこの手口が使われた事例が報告されています。利用者側の対策は、読み取った後に表示される URL のドメインを開く前に確認すること、そして読み取ったリンクを確認なしで開く設定を使わないことに尽きます。コードを掲示する側は、貼り替えられていないか定期的に見て回る運用が必要です。

文字数カウントの観点で押さえておきたいのは、QR コードの容量が「文字数」ではなく「どのモードで 1 文字あたり何ビットを使うか」で決まる点です。たとえば日本語を含む URL をパーセントエンコーディングすると、UTF-8 では 1 文字が 3 バイトになり、それぞれが %XX という 3 文字の表記に置き換わるため、日本語 1 文字あたり 9 バイトをバイトモードで消費します。見た目の文字数を数えただけでは容量を見誤るという意味で、これは文字数とバイト数の違いと同じ問題です。長い URL をコードにするときは、先にバイト数を数えてバージョンの見当をつけておくと、印刷したら想定より大きくなった、あるいは小さすぎて読み取れないという事故を防げます。

この記事を共有