QRコードってどのように作るの?
QRコードは、数字データ(最大7,089文字),英数字データ(最大4,296文字),8ビットバイトデータ(最大2,953文字),漢字データ(最大1,817文字)の4種類の文字をQRコードにすることができます。
8ビットバイトデータを使えばすべての文字が表せますが、数字だけのデータであれば数字データを使ったほうが場合上のデータを表せます。そのため、はじめにQRコードにする文字を解析して、数字データ,英数字データ,8ビットバイトデータ,漢字データの4種類のモードのどれを使えるかを決定します。それ以外に混合モードがあり、複数のモードを文字に応じて使うことができます。
基本的に、出来るだけ多くの文字を格納できるモードを選択すべきである。多くの文字を効率的に格納できる順番は下記の通りである。
1.数字データ(最大7,089文字)
2.英数字データ(最大4,296文字)
3.漢字データ(最大1,817文字 実際には漢字データは2バイトであるため、最大1,817文字の2倍=3,634文字格納できる能力がある)
4.8ビットバイトデータ(最大2,953文字)
ゆえに、数字モードが使える文字ならば必ず数字モードを使い、次に英数字モードが使える文字ならば必ず英数字モードを使い、次に漢字モードが使える文字ならば必ず漢字モードを使う。最後に、どのモードも使えなければ8ビットバイトデータを使う。
8ビットバイトデータモードなら、任意のデータを格納可能であるが、効率がもっとも悪いため、最後の選択にすべきである。
混合モードは、「数字モード」、「英数字モード」、「8ビットバイトモード」、「漢字モード」の4つのモードを組み合わせて使うモードで、最大のデータが格納できるように符号化するデータ列の途中でモードを変更するモードである。混合モードで効率的にデータを格納できるのであれば、混合モードを使うべきである。
数字モードは、「0,1,2,3,4,5,6,7,8,9」の10種類の数字のみを3文字を10ビットで符号化するモード。最大7,089文字を格納できる。
もっとも効率のよいモードである。数字だけのデータの場合には、必ず使用すべきである。
英数字モードは、「0,1,2,3,4,5,6,7,8,9」の10種類の数字と「A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z」の26種類のアルファベット大文字と「 ,$,%,*,+,−,.,/,:」の9種類の記号の合計45種類の文字を符号化するモード。2文字を11ビットで符号化する。最大4,296文字を格納できる。
数字モードの次に格納効率のよいモードである。数字以外のデータがあり、英数字モードが使用できる場合には、必ず使用すべきである。
8ビットバイトモードは、すべての文字を格納でき、1文字を8ビットで符号化するモード。最大2,953文字を格納できる。格納できる文字数は最も少ないが、漢字を含めてすべての文字が格納できる。
8ビットバイトモードは、すべての文字を格納できるためどんな場合でも使用できる。ただし、データを格納する効率がもっとも悪いため、最後の選択にすべきである。
漢字モードは、JIS X 0208で規定される漢字集合(漢字、2バイトの仮名、カタカナ、英数字など)を符号化するモード。2バイト文字列を13ビットで符号化する。最大1,817文字を格納できる。2バイト文字列の格納には最も効率が良いが、1バイト文字は格納できない。
2バイト文字列の格納には最も効率が良いが、1バイト文字は格納できないので、2バイト文字列だけのデータの場合は必ず使うとよい。
混合モードは、「数字モード」、「英数字モード」、「8ビットバイトモード」、「漢字モード」の4つのモードを組み合わせて使うモードで、最大のデータが格納できるように符号化するデータ列の途中でモードを変更するモードである。ゆえに、使用できる文字は各モードで使用できる文字となる。
混合モードは、「数字モード」、「英数字モード」、「8ビットバイトモード」、「漢字モード」の4つのモードを組み合わせて使うモードで、最大のデータが格納できるように符号化するデータ列の途中でモードを変更するモードである。混合モードで効率的にデータを格納できるのであれば、混合モードを使うべきである。
データの符号化とは、QRコードにする文字を規則に従ってビットの文字列に変換し、コード語を作成することである。
データの符号化は、以下の順序で行う。
1.モード指示子の符号化(mode indicator)の符号化
2.文字数指示子の符号化(character count indicator)の符号化
3.データの2進化の符号化
【数字モード】
【英数字モード】
【8ビットモード】
【漢字モード】
【混合モード】
4.終端パターンの符号化(terminator)の符号化
5.埋め草ビットの符号化(padding bit)の符号化
6.埋め草ワードの符号化(padding codeword)の符号化
7.誤り訂正コード語の符号化
8.残余ビットの符号化(remainder bit)の符号化
次のデータ文字列がどのモードで符号化されるかを示す4ビットの識別子
モード指示子は、符号化するデータ文字列がどのモードで符号化されるかを示す4ビットの識別子である。4ビットの識別子は以下の通りである。
モード |
指示子 |
数字モード |
0001 |
英数字モード |
0010 |
8ビットバイトモード |
0100 |
漢字モード |
1000 |
モードの中でデータ文字列の長さを定義するビット列
文字数指示子の長さは、適用するモードおよびシンボルの型番によって変化する。文字数識別子の長さは以下の表のようになる。
型番 |
1〜9 |
10〜26 |
27〜40 |
数字モード |
10 |
12 |
14 |
英数字モード |
9 |
11 |
13 |
8ビットバイトモード |
8 |
16 |
16 |
漢字モード |
8 |
10 |
12 |
上記のビット数になるように文字数を2進数で符号化する。
数字モードは、「0,1,2,3,4,5,6,7,8,9」の10種類の数字のみを3文字を10ビットで符号化するモード。最大7,089文字を格納できる。
数字データ |
値 |
0 |
0 |
1 |
1 |
2 |
2 |
3 |
3 |
4 |
4 |
5 |
5 |
6 |
6 |
7 |
7 |
8 |
8 |
9 |
9 |
数字モードの場合は、数字データがそのまま値になります。
まず、符号化する数字を3桁ごとに分割します。
例えば、0123456を符号化する時は、012 345 6の3つに分割します。
次に、各グループを10ビットの2進数に変換します。ただし、符号化する数字の桁数が3の倍数でない場合は、最後の1桁または2桁はそれぞれ4ビットの2進数と7ビットの2進数に変換します。
例えば、012は2進数に変換すると0000001100になり、345は2進数に変換すると0101011001になり、6は2進数に変換すると0110(最後の6は1桁になるため4ビットの2進数に変換します)になります。
よって、0123456を符号化した2進数は、
0000001100 0101011001 0110
になります。
英数字モードは、「0,1,2,3,4,5,6,7,8,9」の10種類の数字と「A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z」の26種類のアルファベット大文字と「 ,$,%,*,+,−,.,/,:」の9種類の記号の合計45種類の文字を符号化するモード。2文字を11ビットで符号化する。最大4,296文字を格納できる。
文字 | 値 |
0 | 0 |
1 | 1 |
2 | 2 |
3 | 3 |
4 | 4 |
5 | 5 |
6 | 6 |
7 | 7 |
8 | 8 |
9 | 9 |
A | 10 |
B | 11 |
C | 12 |
D | 13 |
E | 14 |
F | 15 |
G | 16 |
H | 17 |
I | 18 |
J | 19 |
K | 20 |
L | 21 |
M | 22 |
N | 23 |
O | 24 |
P | 25 |
Q | 26 |
R | 27 |
S | 28 |
T | 29 |
U | 30 |
V | 31 |
W | 32 |
X | 33 |
Y | 34 |
Z | 35 |
Space | 36 |
$ | 37 |
% | 38 |
* | 39 |
+ | 40 |
- | 41 |
. | 42 |
/ | 43 |
: | 44 |
まず、符号化する英数字を2桁ごとに分割します。
例えば、QR−CODEを符号化する時は、QR −C OD Eの4つに分割します。
次に、各グループを11ビットの2進数に変換します。変換の方法は、最初の文字の値を45倍して、2番目の文字の値を加えます。ただし、符号化する英数字の桁数が2の倍数でない場合は、最後の1桁はそれぞれ6ビットの2進数に変換します。
例えば、QRは最初の文字Qの値は26でそれを45倍して1170。次に2番目の文字Rの値は27なのでそれを加えて1197。2進数に変換すると【10010101101】になります。同様に、−Cを2進数に変換すると【11101000001】に、ODを2進数に変換すると【10001000101】に、Eを2進数に変換すると【001110】(最後のEは1桁になるため6ビットの2進数に変換します)になります。
よって、QR−CODEを符号化した2進数は、
10010101101 11101000001 10001000101 001110
になります。
8ビットバイトモードは、すべての文字を格納でき、1文字を8ビットで符号化するモード。最大2,953文字を格納できる。格納できる文字数は最も少ないが、漢字を含めてすべての文字が格納できる。
例えば、「漢字Code」を符号化する場合を考える。
まず、「漢字Code」をシフトJISコードに変換すると、漢【8ABF】字【8E9A】C【43】o【6F】d【64】e【65】となる。それを、そのまま2進数に変換して、
【10001010】
【10111111】
【10001110】
【10011010】
【01000011】
【01101111】
【01100100】
【01100101】
となる。
漢字モードは、JIS X 0208で規定される漢字集合(漢字、2バイトの仮名、カタカナ、英数字など)を符号化するモード。2バイト文字列を13ビットで符号化する。最大1,817文字を格納できる。2バイト文字列の格納には最も効率が良いが、1バイト文字は格納できない。
例えば、「漢字モード」の5文字を符号化する場合を考える。
漢字データは、通常1文字を2バイト、つまり16ビットで表す。しかし、漢字モードの符号化の場合は、漢字1文字を16ビットではなく13ビットに圧縮して符号化する。
13ビットに符号化する方法は以下の通りである。
1-1.シフトJISコードから0x8140を引く。
1-2.得られた値の上位バイトに0xC0を掛ける。
1-3.その結果に下位バイトを足す。
1-4.その結果を13ビットの2進数に変換する。
2-1.シフトJISコードから0xC140を引く。
2-2.得られた値の上位バイトに0xC0を掛ける。
2-3.その結果に下位バイトを足す。
2-4.その結果を13ビットの2進数に変換する。
例えば、「漢」のシフトJISコードは【8ABF】であるため、「1.シフトJISコードが0x8140〜0x9FFCの場合」の計算ロジックを使う。
8ABF-8140=097F <=シフトJISコードから0x8140を引く。
09*C0=6C0 <=得られた値の上位バイトに0xC0を掛ける。
6C0+7F=73F <=その結果に下位バイトを足す。
73F=0011100111111 <=その結果を13ビットの2進数に変換する。
よって、「漢字モード」はシフトJISコードで、
【8ABF】【8E9A】【8382】【815B】【8368】
であるため、13ビットの2進数に変換すると
【0011100111111】
【0101000011010】
【0000111000010】
【0000000011011】
【0000110101000】
となる。
混合モードは、「数字モード」(最大7,089文字)、「英数字モード」(最大4,296文字)、「8ビットバイトモード」(最大2,953文字)、「漢字モード」(最大1,817文字)の4つのモードを組み合わせて使うモードで、最大のデータが格納できるように符号化するデータ列の途中でモードを変更するモードである。
符号化の方法は、それぞれ「数字モード」、「英数字モード」、「8ビットバイトモード」、「漢字モード」の符号化の方法を使うため、それぞれの符号化の方法を参照する。
データの2進化を行った後には、終端パターンを置く。終端パターンは0000の4ビットである。データビット列がシンボルの容量をすでに満たしている場合は、終端パターンは付けない。また、残りのシンボルの容量が4ビット未満の場合は、残ったビットだけを0で埋める。
終端パターンは0000。
ただし、データビット列がシンボルの容量をすでに満たしている場合は、終端パターンは付けない。
また、残りのシンボルの容量が4ビット未満の場合は、残ったビットだけを0で埋める。
ここまでで得られた2進数のビット列を、8ビットずつのワード語に分割する。分割したワード語のうち、最後のワード語の長さが8ビットではない場合は、最後のワード語に0を補い8ビットの長さにする。このときに追加するビットのことを埋め草ビットと言う。
最後のワード語が8ビットの場合 − 埋め草ビットはなし
最後のワード語が7ビットの場合 − 埋め草ビットは0
最後のワード語が6ビットの場合 − 埋め草ビットは00
最後のワード語が5ビットの場合 − 埋め草ビットは000
最後のワード語が4ビットの場合 − 埋め草ビットは0000
最後のワード語が3ビットの場合 − 埋め草ビットは00000
最後のワード語が2ビットの場合 − 埋め草ビットは000000
最後のワード語が1ビットの場合 − 埋め草ビットは0000000
型番と誤り訂正レベルごとにデータワード語の語数は決まっている。もし、上記の手順で符号化をしてデータワード語の語数に足りない場合は、埋め草ワード(11101100と00010001の交互のワード)を追加して、データワード語の語数と同じになるようにする。
調べ方は、下記の「型番・誤り訂正レベルごとのデータワード語の語数」一覧表で、型番と誤り訂正レベルを当てはめて、データワード語の語数を見つける。
埋め草ワードは「11101100」と「00010001」を交互に付加する。
型番 | 誤り 訂正 レベル |
データ コード語 |
1 | L | 19 |
1 | M | 16 |
1 | Q | 13 |
1 | H | 9 |
2 | L | 34 |
2 | M | 28 |
2 | Q | 22 |
2 | H | 16 |
3 | L | 55 |
3 | M | 44 |
3 | Q | 34 |
3 | H | 26 |
4 | L | 80 |
4 | M | 64 |
4 | Q | 48 |
4 | H | 36 |
5 | L | 108 |
5 | M | 86 |
5 | Q | 62 |
5 | H | 46 |
6 | L | 136 |
6 | M | 108 |
6 | Q | 76 |
6 | H | 60 |
7 | L | 156 |
7 | M | 124 |
7 | Q | 88 |
7 | H | 66 |
8 | L | 194 |
8 | M | 154 |
8 | Q | 110 |
8 | H | 86 |
9 | L | 232 |
9 | M | 182 |
9 | Q | 132 |
9 | H | 100 |
10 | L | 274 |
10 | M | 216 |
10 | Q | 154 |
10 | H | 122 |
11 | L | 324 |
11 | M | 254 |
11 | Q | 180 |
11 | H | 140 |
12 | L | 370 |
12 | M | 290 |
12 | Q | 206 |
12 | H | 158 |
13 | L | 428 |
13 | M | 334 |
13 | Q | 244 |
13 | H | 180 |
14 | L | 461 |
14 | M | 365 |
14 | Q | 261 |
14 | H | 197 |
15 | L | 523 |
15 | M | 415 |
15 | Q | 295 |
15 | H | 223 |
16 | L | 589 |
16 | M | 453 |
16 | Q | 325 |
16 | H | 253 |
17 | L | 647 |
17 | M | 507 |
17 | Q | 367 |
17 | H | 283 |
18 | L | 721 |
18 | M | 563 |
18 | Q | 397 |
18 | H | 313 |
19 | L | 795 |
19 | M | 627 |
19 | Q | 445 |
19 | H | 341 |
20 | L | 861 |
20 | M | 669 |
20 | Q | 485 |
20 | H | 385 |
21 | L | 932 |
21 | M | 714 |
21 | Q | 512 |
21 | H | 406 |
22 | L | 1006 |
22 | M | 782 |
22 | Q | 568 |
22 | H | 442 |
23 | L | 1094 |
23 | M | 860 |
23 | Q | 614 |
23 | H | 464 |
24 | L | 1174 |
24 | M | 914 |
24 | Q | 664 |
24 | H | 514 |
25 | L | 1276 |
25 | M | 1000 |
25 | Q | 718 |
25 | H | 538 |
26 | L | 1370 |
26 | M | 1062 |
26 | Q | 754 |
26 | H | 596 |
27 | L | 1468 |
27 | M | 1128 |
27 | Q | 808 |
27 | H | 628 |
28 | L | 1531 |
28 | M | 1193 |
28 | Q | 871 |
28 | H | 661 |
29 | L | 1631 |
29 | M | 1267 |
29 | Q | 911 |
29 | H | 701 |
30 | L | 1735 |
30 | M | 1373 |
30 | Q | 985 |
30 | H | 745 |
31 | L | 1843 |
31 | M | 1455 |
31 | Q | 1033 |
31 | H | 793 |
32 | L | 1955 |
32 | M | 1541 |
32 | Q | 1115 |
32 | H | 845 |
33 | L | 2071 |
33 | M | 1631 |
33 | Q | 1171 |
33 | H | 901 |
34 | L | 2191 |
34 | M | 1725 |
34 | Q | 1231 |
34 | H | 961 |
35 | L | 2306 |
35 | M | 1812 |
35 | Q | 1286 |
35 | H | 986 |
36 | L | 2434 |
36 | M | 1914 |
36 | Q | 1354 |
36 | H | 1054 |
37 | L | 2566 |
37 | M | 1992 |
37 | Q | 1426 |
37 | H | 1096 |
38 | L | 2702 |
38 | M | 2102 |
38 | Q | 1502 |
38 | H | 1142 |
39 | L | 2812 |
39 | M | 2216 |
39 | Q | 1582 |
39 | H | 1222 |
40 | L | 2956 |
40 | M | 2334 |
40 | Q | 1666 |
40 | H | 1276 |
誤り訂正コード語は、QRコードの一部が読めない場合でもデータを損失することなく、シンボルが損傷に耐えることができるように、データコード語列の後に追加する語である。
詳細は、誤り訂正符号化の項目を参照のこと。
残余ビットは、シンボルの型番によって決まっている。目的はシンボルの容量を完全に満たすためにデータの最後に、3ビット、4ビット、7ビットの値が0のビットを付加する。
下記の残余ビット一覧表で、残余ビットの数を調べる
残余ビットが0の場合 − 残余ビットはなし
残余ビットが3の場合 − 残余ビットは000
残余ビットが4の場合 − 残余ビットは0000
残余ビットが7の場合 − 残余ビットは0000000
型番 | 残余ビット |
1 | 0 |
2 | 7 |
3 | 7 |
4 | 7 |
5 | 7 |
6 | 7 |
7 | 0 |
8 | 0 |
9 | 0 |
10 | 0 |
11 | 0 |
12 | 0 |
13 | 0 |
14 | 3 |
15 | 3 |
16 | 3 |
17 | 3 |
18 | 3 |
19 | 3 |
20 | 3 |
21 | 4 |
22 | 4 |
23 | 4 |
24 | 4 |
25 | 4 |
26 | 4 |
27 | 4 |
28 | 3 |
29 | 3 |
30 | 3 |
31 | 3 |
32 | 3 |
33 | 3 |
34 | 3 |
35 | 0 |
36 | 0 |
37 | 0 |
38 | 0 |
39 | 0 |
40 | 0 |
「01234567890123456789」 を符号化する。
種類選択=Numeric
モジュールサイズ=21
結果Version=1
数字=67
モード指示子=0001(2進)1(10進)1(16進)
文字数=0000010100(2進)20(10進)014(16進)
データ=【0000001100】【0101011001】【1010100110】【1110000101】【0011101010】【1000110111】【1011001】(2進)
【12】【345】【678】【901】【234】【567】【89】(10進)
【00C】【159】【2A6】【385】【0EA】【237】【59】(16進)
終端=0000(2進)0(10進)0(16進)
埋め草ビット=【000】(2進)
埋め草ワード=【11101100】【00010001】【11101100】【00010001】【11101100】【00010001】【11101100】【00010001】(2進)
誤り訂正コード語=【11000010】【01011110】【10011011】【01110100】【11110101】【10011100】【00011011】(2進)
残余ビット=(2進)
「最近の携帯電話は非常に高性能で驚きます。」 を符号化する。
種類選択=Kanji
モジュールサイズ=25
結果Version=2
漢字=260
モード指示子=1000(2進)8(10進)8(16進)
文字数=00010100(2進)20(10進)14(16進)
データ=【0100110000101】【0100000011111】【0000101001100】【0100001100111】【0110010010001】【0110110100100】【1000101100010】【0000101001101】【0111011110001】【0101100101101】【0000101001001】【0100101000010】【0101110101011】【0111001011100】【0000101000101】【0100000000001】【0000100101011】【0000101011100】【0000100110111】【0000000000010】(2進)
【2437】【2079】【332】【2151】【3217】【3492】【4450】【333】【3825】【2861】【329】【2370】【2987】【3676】【325】【2049】【299】【348】【311】【2】(10進)
【0985】【081F】【014C】【0867】【0C91】【0DA4】【1162】【014D】【0EF1】【0B2D】【0149】【0942】【0BAB】【0E5C】【0145】【0801】【012B】【015C】【0137】【0002】(16進)
終端=(2進)0(10進)(16進)
埋め草ビット=【】(2進)
埋め草ワード=【】(2進)
誤り訂正コード語=【11000010】【10101010】【10100010】【10111010】【10111110】【00100111】【01100100】【01110100】【10111001】【11110001】(2進)
残余ビット=0000000(2進)
「I HAVE A PEN IN MY HAND.」 を符号化します。
種類選択=AlphaNumeric
モジュールサイズ=21
結果Version=1
英数字=132
モード指示子=0010(2進)2(10進)2(16進)
文字数=000011000(2進)24(10進)018(16進)
データ=【01101001110】【01100000111】【10110000001】【11001011110】【11001101101】【01010001101】【11001100110】【10000101111】【10000000000】【11001100101】【00111011001】【01001110011】(2進)
【846】【775】【1409】【1630】【1645】【653】【1638】【1071】【1024】【1637】【473】【627】(10進)
【34E】【307】【581】【65E】【66D】【28D】【666】【42F】【400】【665】【1D9】【273】(16進)
終端=0000(2進)0(10進)0(16進)
埋め草ビット=【000】(2進)
埋め草ワード=【】(2進)
誤り訂正コード語=【01011010】【00000100】【10010101】【00000101】【00000100】【00101011】【10101001】(2進)
残余ビット=(2進)
「 このデータは8Bitモードでしか符号化できません。」 を符号化します。
種類選択=Binary
モジュールサイズ=29
結果Version=3
バイナリ=368
モード指示子=0100(2進)4(10進)4(16進)
文字数=00101110(2進)46(10進)2E(16進)
データ=【10000010】【10110001】【10000010】【11001100】【10000011】【01100110】【10000001】【01011011】【10000011】【01011110】【10000010】【11001101】【00111000】【01000010】【01101001】【01110100】【10000011】【10000010】【10000001】【01011011】【10000011】【01101000】【10000010】【11000101】【10000010】【10110101】【10000010】【10101001】【10010101】【10000100】【10001101】【10000110】【10001001】【10111011】【10000010】【11000101】【10000010】【10101011】【10000010】【11011100】【10000010】【10111001】【10000010】【11110001】【10000001】【01000010】(2進)
【130】【177】【130】【204】【131】【102】【129】【91】【131】【94】【130】【205】【56】【66】【105】【116】【131】【130】【129】【91】【131】【104】【130】【197】【130】【181】【130】【169】【149】【132】【141】【134】【137】【187】【130】【197】【130】【171】【130】【220】【130】【185】【130】【241】【129】【66】(10進)
【82】【B1】【82】【CC】【83】【66】【81】【5B】【83】【5E】【82】【CD】【38】【42】【69】【74】【83】【82】【81】【5B】【83】【68】【82】【C5】【82】【B5】【82】【A9】【95】【84】【8D】【86】【89】【BB】【82】【C5】【82】【AB】【82】【DC】【82】【B9】【82】【F1】【81】【42】(16進)
終端=0000(2進)0(10進)0(16進)
埋め草ビット=【】(2進)
埋め草ワード=【11101100】【00010001】【11101100】【00010001】【11101100】【00010001】【11101100】(2進)
誤り訂正コード語=【10001001】【11110100】【11010100】【10101000】【00011010】【01101000】【11111001】【10111111】【00010110】【01101010】【01101111】【11001011】【10101001】【00110010】【00110001】(2進)
残余ビット=0000000(2進)