バーコードリーダーになろう ― Code128編 (KLabTechBook Vol.6)
この記事は2020年3月7日から開催された技術書典 応援祭にて頒布した「KLabTechBook Vol.6」に掲載したものです。
現在開催中の技術書典15オンラインマーケットにて新刊「KLabTechBook Vol.12」を頒布(電子版無料、紙+電子 500円)しています。 また、既刊も在庫があるものは物理本をオンラインマーケットで頒布しているほか、 KLabのブログからもすべての既刊のPDFを無料DLできます。 合わせてごらんください。
バーコード、読んでますか?
KLab Tech Book Vol.3「バーコードリーダーになろう」1では レジで読み取るようなEAN規格2のバーコードの読み方を解説しました。 お読みになった皆さんは、日々バーコードを肉眼で読んでいることと思います。
ところで、図1のような箱を見たことがきっとあることでしょう。
▲図1 よく見かける箱
この箱に付けられているバーコード3種類を拡大したものが図2になります。 これらのバーコードはEANではなく、すべてCode128という規格のバーコードです。
▲図2 箱に付けられたバーコード
この章では、私達の身近にも使われているこのCode128について解説します。 読み方をマスターしましょう。
Code128とは
Vol.3で紹介したEANは13桁の数字しか表現できませんでしたが、 Code128はアルファベットや記号も表現できる珍しいバーコードです。
1981年にアメリカのコンピュータアイデンティクス社により開発されたCode128は、 元々コンピュータへの入力用にASCIIコードに含まれる128種類の文字を表現できるものとして考案されました。 これがCode128の名前の由来にもなっています。
Code128が表現できる文字にはASCIIコードの制御文字も含まれますし、 加えて128~255のバイト値も符号化できるようになっています3。 また規格上は桁数にも制限がないため、実質どんなバイト列でも表現できます4。
現在ではJIS X 0504やISO/IEC 15417として規格化され、物流の分野を中心に世界中で使われています。
Code128の構造
Code128の構造を図35に示します。
▲図3 Code128の構造
Code128では、1~4モジュール幅の黒か白のバー6本を合計11モジュール幅となるように並べたものを1シンボルキャラクタとして扱い、左から順に読んでいきます。
左端は表1に示す3種類のスタートキャラクタのいずれかで始まり、 1つ以上のデータキャラクタが並びます。 そして1つのシンボルチェックキャラクタがあり、ストップキャラクタが右端になります。 ストップキャラクタは6本の後ろに2モジュール幅の黒のバーを加えた7本で13モジュール幅です。 また、両側には10モジュール幅以上の空白が必要です。
▼表1 スタートキャラクタとストップキャラクタ
| 値 | コード | エレメント幅 | エレメントパターン |
|---|---|---|---|
| 103 | スタートA | 2:1:1:4:1:2 | ![]() |
| 104 | スタートB | 2:1:1:2:1:4 | ![]() |
| 105 | スタートC | 2:1:1:2:3:2 | ![]() |
| — | ストップ | 2:3:3:1:1:1:2 | ![]() |
シンボルキャラクタ表
Code128では、103種類のシンボルが定義されており、シンボルキャラクタ値として0~102が割り当てられています。 それぞれの値を文字に割り当てるコードセットはA・B・Cの3種類があり、途中で切り替えることもできます。 開始時のコードセットはスタートキャラクタによって指定されます。
コードAは英大文字・数字・記号・制御文字、コードBは英大小文字・数字・記号が1キャラクタごとに割り当てられています。 コードセットCは1キャラクタで数字2文字を表します。
ちょっと多いですが覚えてしまいましょう。 バーの合計モジュール幅は偶数、スペースの合計は奇数になっているという特性を知っておくと覚えやすいです。
▼表2 シンボルキャラクタ表
| 値 | コードA | コードB | コードC | エレメント幅 | エレメントパターン |
|---|---|---|---|---|---|
| 0 | SP | SP | 00 |
2:1:2:2:2:2 | ![]() |
| 1 | ! |
! |
01 |
2:2:2:1:2:2 | ![]() |
| 2 | " |
" |
02 |
2:2:2:2:2:1 | ![]() |
| 3 | # |
# |
03 |
1:2:1:2:2:3 | ![]() |
| 4 | $ |
$ |
04 |
1:2:1:3:2:2 | ![]() |
| 5 | % |
% |
05 |
1:3:1:2:2:2 | ![]() |
| 6 | & |
& |
06 |
1:2:2:2:1:3 | ![]() |
| 7 | ' |
' |
07 |
1:2:2:3:1:2 | ![]() |
| 8 | ( |
( |
08 |
1:3:2:2:1:2 | ![]() |
| 9 | ) |
) |
09 |
2:2:1:2:1:3 | ![]() |
| 10 | * |
* |
10 |
2:2:1:3:1:2 | ![]() |
| 11 | + |
+ |
11 |
2:3:1:2:1:2 | ![]() |
| 12 | , |
, |
12 |
1:1:2:2:3:2 | ![]() |
| 13 | - |
- |
13 |
1:2:2:1:3:2 | ![]() |
| 14 | . |
. |
14 |
1:2:2:2:3:1 | ![]() |
| 15 | / |
/ |
15 |
1:1:3:2:2:2 | ![]() |
| 16 | 0 |
0 |
16 |
1:2:3:1:2:2 | ![]() |
| 17 | 1 |
1 |
17 |
1:2:3:2:2:1 | ![]() |
| 18 | 2 |
2 |
18 |
2:2:3:2:1:1 | ![]() |
| 19 | 3 |
3 |
19 |
2:2:1:1:3:2 | ![]() |
| 20 | 4 |
4 |
20 |
2:2:1:2:3:1 | ![]() |
| 21 | 5 |
5 |
21 |
2:1:3:2:1:2 | ![]() |
| 22 | 6 |
6 |
22 |
2:2:3:1:1:2 | ![]() |
| 23 | 7 |
7 |
23 |
3:1:2:1:3:1 | ![]() |
| 24 | 8 |
8 |
24 |
3:1:1:2:2:2 | ![]() |
| 25 | 9 |
9 |
25 |
3:2:1:1:2:2 | ![]() |
| 26 | : |
: |
26 |
3:2:1:2:2:1 | ![]() |
| 27 | ; |
; |
27 |
3:1:2:2:1:2 | ![]() |
| 28 | < |
< |
28 |
3:2:2:1:1:2 | ![]() |
| 29 | = |
= |
29 |
3:2:2:2:1:1 | ![]() |
| 30 | > |
> |
30 |
2:1:2:1:2:3 | ![]() |
| 31 | ? |
? |
31 |
2:1:2:3:2:1 | ![]() |
| 32 | @ |
@ |
32 |
2:3:2:1:2:1 | ![]() |
| 33 | A |
A |
33 |
1:1:1:3:2:3 | ![]() |
| 34 | B |
B |
34 |
1:3:1:1:2:3 | ![]() |
| 35 | C |
C |
35 |
1:3:1:3:2:1 | ![]() |
| 36 | D |
D |
36 |
1:1:2:3:1:3 | ![]() |
| 37 | E |
E |
37 |
1:3:2:1:1:3 | ![]() |
| 38 | F |
F |
38 |
1:3:2:3:1:1 | ![]() |
| 39 | G |
G |
39 |
2:1:1:3:1:3 | ![]() |
| 40 | H |
H |
40 |
2:3:1:1:1:3 | ![]() |
| 41 | I |
I |
41 |
2:3:1:3:1:1 | ![]() |
| 42 | J |
J |
42 |
1:1:2:1:3:3 | ![]() |
| 43 | K |
K |
43 |
1:1:2:3:3:1 | ![]() |
| 44 | L |
L |
44 |
1:3:2:1:3:1 | ![]() |
| 45 | M |
M |
45 |
1:1:3:1:2:3 | ![]() |
| 46 | N |
N |
46 |
1:1:3:3:2:1 | ![]() |
| 47 | O |
O |
47 |
1:3:3:1:2:1 | ![]() |
| 48 | P |
P |
48 |
3:1:3:1:2:1 | ![]() |
| 49 | Q |
Q |
49 |
2:1:1:3:3:1 | ![]() |
| 50 | R |
R |
50 |
2:3:1:1:3:1 | ![]() |
| 51 | S |
S |
51 |
2:1:3:1:1:3 | ![]() |
| 52 | T |
T |
52 |
2:1:3:3:1:1 | ![]() |
| 53 | U |
U |
53 |
2:1:3:1:3:1 | ![]() |
| 54 | V |
V |
54 |
3:1:1:1:2:3 | ![]() |
| 55 | W |
W |
55 |
3:1:1:3:2:1 | ![]() |
| 56 | X |
X |
56 |
3:3:1:1:2:1 | ![]() |
| 57 | Y |
Y |
57 |
3:1:2:1:1:3 | ![]() |
| 58 | Z |
Z |
58 |
3:1:2:3:1:1 | ![]() |
| 59 | [ |
[ |
59 |
3:3:2:1:1:1 | ![]() |
| 60 | \ |
\\ |
60 |
3:1:4:1:1:1 | ![]() |
| 61 | ] |
] |
61 |
2:2:1:4:1:1 | ![]() |
| 62 | ^ |
^ |
62 |
4:3:1:1:1:1 | ![]() |
| 63 | _ |
_ |
63 |
1:1:1:2:2:4 | ![]() |
| 64 | NUL | ̀ |
64 |
1:1:1:4:2:2 | ![]() |
| 65 | SOH | a |
65 |
1:2:1:1:2:4 | ![]() |
| 66 | STX | b |
66 |
1:2:1:4:2:1 | ![]() |
| 67 | ETX | c |
67 |
1:4:1:1:2:2 | ![]() |
| 68 | EOT | d |
68 |
1:4:1:2:2:1 | ![]() |
| 69 | ENQ | e |
69 |
1:1:2:2:1:4 | ![]() |
| 70 | ACK | f |
70 |
1:1:2:4:1:2 | ![]() |
| 71 | BEL | g |
71 |
1:2:2:1:1:4 | ![]() |
| 72 | BS | h |
72 |
1:2:2:4:1:1 | ![]() |
| 73 | HT | i |
73 |
1:4:2:1:1:2 | ![]() |
| 74 | LF | j |
74 |
1:4:2:2:1:1 | ![]() |
| 75 | VT | k |
75 |
2:4:1:2:1:1 | ![]() |
| 76 | FF | l |
76 |
2:2:1:1:1:4 | ![]() |
| 77 | CR | m |
77 |
4:1:3:1:1:1 | ![]() |
| 78 | SO | n |
78 |
2:4:1:1:1:2 | ![]() |
| 79 | SI | o |
79 |
1:3:4:1:1:1 | ![]() |
| 80 | DLE | p |
80 |
1:1:1:2:4:2 | ![]() |
| 81 | DC1 | q |
81 |
1:2:1:1:4:2 | ![]() |
| 82 | DC2 | r |
82 |
1:2:1:2:4:1 | ![]() |
| 83 | DC3 | s |
83 |
1:1:4:2:1:2 | ![]() |
| 84 | DC4 | t |
84 |
1:2:4:1:1:2 | ![]() |
| 85 | NAK | u |
85 |
1:2:4:2:1:1 | ![]() |
| 86 | SYN | v |
86 |
4:1:1:2:1:2 | ![]() |
| 87 | ETB | w |
87 |
4:2:1:1:1:2 | ![]() |
| 88 | CAN | x |
88 |
4:2:1:2:1:1 | ![]() |
| 89 | EM | y |
89 |
2:1:2:1:4:1 | ![]() |
| 90 | SUB | z |
90 |
2:1:4:1:2:1 | ![]() |
| 91 | ESC | { |
91 |
4:1:2:1:2:1 | ![]() |
| 92 | FS | | |
92 |
1:1:1:1:4:3 | ![]() |
| 93 | GS | } |
93 |
1:1:1:3:4:1 | ![]() |
| 94 | RS | ~ |
94 |
1:3:1:1:4:1 | ![]() |
| 95 | US | DEL | 95 |
1:1:4:1:1:3 | ![]() |
| 96 | FNC3 | FNC3 | 96 |
1:1:4:3:1:1 | ![]() |
| 97 | FNC2 | FNC2 | 97 |
4:1:1:1:1:3 | ![]() |
| 98 | シフト | シフト | 98 |
4:1:1:3:1:1 | ![]() |
| 99 | コードC | コードC | 99 |
1:1:3:1:4:1 | ![]() |
| 100 | コードB | FNC4 | コードB | 1:1:4:1:3:1 | ![]() |
| 101 | FNC4 | コードA | コードA | 3:1:1:1:4:1 | ![]() |
| 102 | FNC1 | FNC1 | FNC1 | 4:1:1:1:3:1 | ![]() |
シンボルチェックキャラクタの計算
スタートキャラクタの値と、データキャラクタの値に重み(出現位置)を掛けた値をすべて合計し、 それを103で割った余りがシンボルチェックキャラクタの値になります。
算出した値と読み取ったシンボルチェックキャラクタの値が一致するかどうかで、読み取りエラーかどうかを判定します。
このように、シンボルチェックキャラクタはデータではないため、バーコードリーダーでは通常表示しません。
演習
それでは、よく見かける箱に印字されていたバーコードを読んでみましょう。
▲図4 印字されていたバーコード
2:1:1:2:1:4スタートB3:3:1:1:2:156-B 「X」1:1:3:1:2:345-B 「M」2:1:3:2:1:221-B 「5」2:2:3:2:1:118-B 「2」2:2:1:1:1:4シンボルチェックキャラクタ 762:3:3:1:1:1:2ストップ
シンボルチェックキャラクタの値も計算して比較してみましょう。
104 + 1 × 56 + 2 × 45 + 3 × 21 + 4 × 18 = 385
385 mod 103 = 76
正しく読み取れたことがわかりました。
まとめ
この章ではCode128の基本的な読み方を解説しました。 今回は特殊キャラクタ(シフト、FNC1〜4)の説明を省略しましたが、これは皆さんへの宿題とします。 ぜひJISやISOの規格書を調べてみてください。
これであなたもバーコードリーダー!











































































































