🏁

奥深いバーコードの仕組み

2023/02/15に公開

バーコードとは

縞模様の線の太さによって数値を表すシンボルのことで、1次元コードとも呼ばれます。
バーコード自体は世界共通の規格ですが、特に日本で使われているバーコードはJANコードと呼ばれています。[1]
barcode example
JANコードの例

JANコード

標準タイプは13桁、短縮タイプは8桁で構成されています。
更に標準タイプは事業者コードが7桁と9桁のものに分けられ、7桁の場合は商品コードは5桁に、9桁の場合は商品コードは3桁になります。
標準タイプ、短縮タイプ共に先頭の2桁が国コード(日本では47か49)、最後の1桁はチェックデジットとなっています。

jancode type
バーコード講座より

JANコードの構成

jancode structure
バーコード講座より

JANコードは01のbitで表されます。0が白で1が黒です。
また構成要素としてガードバー、データキャラクタ、チェックデジットがあります。
それぞれ解説していきます。

ガードバー

バーコードの線で少し下にはみ出しているものがガードバーと呼ばれるものです。
これはバーコードの始まり・終わりと真ん中を示すものです。
それぞれ101、01010、101で表されます。

データキャラクタ

標準タイプではセンターバーの左に6桁、右に5桁分の文字が格納されています。
数値はそれぞれ以下の表の通りに変換されます。
偶数パリティと奇数パリティ[2]は1桁目を決定する際に考慮します。

数値 左奇数パリティ 左偶数パリティ 右偶数パリティ
0 0001101 0100111 1110010
1 0011001 0110011 1100110
2 0010011 0011011 1101100
3 0111101 0100001 1000010
4 0100011 0011101 1011100
5 0110001 0111001 1001110
6 0101111 0000101 1010000
7 0111011 0010001 1000100
8 0110111 0001001 1001000
9 0001011 0010111 1110100

標準タイプの1桁目は以下の表の通り、奇数パリティと偶数パリティの組み合わせによって決定されます。
短縮タイプの場合は全て奇数パリティになります。

1桁目 奇数(O)と偶数(E)の組み合わせ
0 OOOOOO
1 OOEOEE
2 OOEEOE
3 OOEEEO
4 OEOOEE
5 OEEOOE
6 OEEEOO
7 OEOEOE
8 OEOEEO
9 OEEOEO

つまり標準タイプで1234567890123のようなJANコードは以下のように変換されます。

標準タイプなので1桁目の奇数パリティと偶数パリティの組み合わせを求める。今回の場合は1なので上の表よりOOEOEEとなる。
2~6桁目を求めた奇数パリティと偶数パリティの組み合わせに従って上の表より求める。
2桁目は2の奇数パリティなので0010011となる。同じように3桁目は3で奇数パリティなので0111101、4桁目は4で偶数パリティなので0011101のように求めていく。
右は偶数パリティしか定義されていないので表の通りに変換する。

チェックデジット

JANコードの最後の1桁は読み取り結果の正誤を判定するためのチェックデジット[3]となっています。
チェックデジットは以下の通りに算出します。

桁番号 1 2 3 4 5 6 7 8 9 10 11 12 13
バーコード 4 9 3 3 0 3 2 0 1 0 5 7 9
  1. 全ての偶数桁の数字を加算し、その結果を3倍する。

    (9+3+3+0+0+7)×3=66
  2. チェックデジットとなる最後の桁を除いた、全ての奇数桁の数字を加算する。

    (4+3+0+2+1+5)=15
  3. 1と2の結果を加算。

    66+15=81
  4. 3の結果の10の剰余の値を10から引いた値がチェックデジット。
    ただし、3の結果の10の剰余の値が0の場合はチェックデジットは0。

    (10-(81\%10))\%10=9

この場合は計算結果が9となりチェックデジットである最後の桁の値である9と合致しているので読み取り結果は正しいと言えます。

JANコードの生成

以上の手順に従って4933032010579というJANコードを変換するとこのようになります。

レフトガードバー 1桁目 2桁目 3桁目 4桁目 5桁目 6桁目 センターバー 7桁目 8桁目 9桁目 10桁目 11桁目 チェックデジット ライドガードバー
101 0001011 0100001 0111101 0001101 0100001 0011011 01010 1110010 1100110 1110010 1001110 1000100 1110100 101

これを1を黒、0を白で塗るとJANコードが完成します。

jancode

おわりに

個人的には1桁目を奇数パリティ・偶数パリティの組み合わせで表現しているのが面白いなぁと思いました。
ちなみにJANコードを生成するPythonのライブラリを作ってみたので良ければ触ってみてください😊

https://pypi.org/project/jancode

ソースコードはこちらにあります
https://github.com/yashikota/jancode

参考文献

https://www.keyence.co.jp/ss/products/autoid/codereader/basic_jan.jsp

脚注
  1. JANはJapanese Article Numberの略称。ちなみに欧州ではEANコード、米国ではUPCコードと呼ばれています。 ↩︎

  2. ちなみに奇数パリティと偶数パリティは1の数が奇数か偶数かです。 ↩︎

  3. モジュラス10/ウエイト3 と呼ばれるものが使われています。 ↩︎

GitHubで編集を提案

Discussion