![見出し画像](https://assets.st-note.com/production/uploads/images/124883712/rectangle_large_type_2_e63066a20873dbd987119e542ca8d96d.png?width=1200)
バーコードの不思議(No338)
バーコード(1次元バーコード)を知らない方はおられないでしょう。
スーパーやコンビニで販売されている様々な商品のほとんどに、バーコードが付いています。
野菜や魚介類、肉類などもバーコードが付いていることがほとんどです。
ですが、このバーコードの仕組みについてはいろいろと面白い話があります。
今回はバーコードについてお話をします。
バーコード
スーパーやコンビニでレジ係の人が商品のバーコードを読み取ると、商品名や価格が出てきます。
バーコードの下には必ず13ケタの数字が書いてありますから、「バーコードってこの数字のことなんだろうな」と思っている方は多いと思います。
これは実際その通りなのですが、この数字そのものがナゾですよね?
・バーコードの番号ってどうやって決めるの?
メーカ登録とかしてるのかな?とは思うが、具体的には???
・お店でパックを作っているお肉とかのバーコードは一体どうやって決めるの?
(技術オタクである)筆者は以下の三点が長い間ナゾでした。
・どうして、上下逆に読み込んでも数字が逆にならないの?
・なぜ1ケタ目が枠の外に書かれているの?
・必ずしも同じ数字が同じパターンになってないのはなぜ?
今回はこういったバーコードのナゾのお話をしましょう。
バーコードはJANコード
ここまで「バーコード」と書いてきましたが、実はバーコードというのは総称で、一般的に商品に印刷されているバーコードはJANコード(ジャンコード)という名称があります。(JAN以外にもバーコードはいろいろとありますが、ここでは省略します)
JANコードは、Japanese Article Numberの略で、名前の通り、日本国内用の商品コード体系で、通常は13ケタの数字で表現されます。
13ケタは、7ケタ(または9ケタ)の事業者コード+5ケタ(または3ケタ)の商品コード+1ケタのチェックデジットという構成になっています。
手元にあるJANコードをいくつか書いてみます。
4902778 56132 4 ゲルインクボールペン(ゼブラ)
4901991 66179 0 蛍光ペン(トンボ)
4902201 21200 1 コーヒー(ネスレ)
いずれも最初の7ケタが事業者コードで続く5ケタが商品コード、最後の1ケタがチェックデジット(チェック用コード)となっています。
日本ではこれをJANと呼んでいますが、JAN自体が国際体系のGTIN-13と呼ばれる体系に乗っ取っています。
上記の例ではいずれも先頭の2ケタが49となっていますが、49は日本の事業者用に割り当てられたコードで、日本の事業者は全て先頭が45か49になります。
国内で販売される商品のほとんどが4で始まっているのはそのためです。
ちなみに、日本国内でJANコードを登録するには、一般財団法人流通システム開発センターへの申請を行って事業者コードを振り出してもらい、各商品を登録する必要がありますので、同じJANコードが重複発行することがないような仕組みになっています。
なお、末尾のチェックデジットというのは、途中の番号が間違っていた時に備えた保険のようなものです。
最初の12ケタの値を全て足し算し、その下1ケタの値を13ケタ目としてJANコードを作ります。
で、実際にバーコードリーダで読み込んだ時にも同じ計算をして、13ケタ目の値と比べます。両者は一致していれば正しく読み込めた、違っていればエラーの可能性がある、と考えるわけです。(実際のJANコードのチェックデジットの計算はもう少し複雑です)
インストアコードとJANコード
JANコードがメーカごと、商品ごとに定義され、重複がないように管理されていることはわかりましたが、必ずしも全ての商品が登録番号を持っているとは限りません。
お肉のようにパックごとに価格が異なる場合や、お店独自レシピのお惣菜は誰も登録をしてくれません。
まさか、新しいお惣菜メニューを全て商品登録をするわけにはいきませんし、全てのグラム数のお肉を登録するわけにもいきません。
JAN(及びGTIN-13)コードでは、こういったお店独自のコードを自由に振り出して良い番号が規定されています。
JANコードの先頭が20~29なら、その後はお店で好きなように番号を使って良いことになっています。
例えばこんな風に20+商品コード(3ケタ)+価格(7ケタ)といった構成のJANコードを使ってもいいわけです。(ブタ肉=100、トリ肉=200としています)
20 100 0000498 → ブタ肉の498円パック
20 200 0000218 → トリ肉の218円パック
こういったお店独自のコードを持たせることをインストアコード(インストーアマーキング)と呼びます。
上記の例では、販売価格をバーコード内に埋め込みましたが、このようにインストアコードを使うとお店側で自由に使い方を決めてもOKということになっています。
バーコードを読むと上下逆かどうかを検出できる
さて、次にバーコードリーダで読み込む時に上下逆に読ませても結果が反転しない理由です。
これは、JANコードではバーコード作成時に工夫をしているためです。
工夫といっても至って単純な話です。
まず、JANコードでは1つの数字を2つのバー(棒)の巾で決めることになっています。
例えば、JANコードの「1」は、巾2のバーと巾1のバーで表現されます。(厳密にはバーとバーの間の空白の巾も意味があります。また、後述のように同じ数字に複数の表記パターンがあります)
正しい方向では、この2つのバーの巾が0~9のどれのパターンと一致しますが、上下逆さまだと、1文字目が必ずエラー(どの数字のバー巾にも一致しない)ように作られています。
これによって、1文字目がエラー=逆向きと判断し、逆方向でスキャンし直します。こうすれば上下が逆でも正しく読み取りができるわけですね。
(余談)1ケタ目がバーコード枠の外に書いてある理由
この章と次の章は以前から筆者自身が疑問に思っていて、解決していなかったことを調べた結果です。
かなりマニアックでややこしい内容であるため、章全体を余談扱いとします。
JANコードではバーコードの下に数字が書いてあります。ですが、妙なことに最初の1ケタ(通常は4)だけはバーコードのさらに左側のはみ出たところに書かれています。
JANコードでは数字1ケタを2つのバー(黒棒)の巾で示すのですが、バーコード全体を見ても、バーは24本(12文字分)しかありません。(左端、中央、右端にある長い2本のバーは除きます)
これでは、12文字しか表現できません。
どうやって13文字を表現するのでしょう?
JANコードでは、最初の6ケタ分については、0~9を表現するパターンを2種類づつ用意しています。(パターンAとパターンB)
このAパターンとBパターンの使い分けによって、1文字目の値が関接的にわかるというややこしいことをしています。
言葉だけではわからないと思いますので、その使い分けを表にします。
それぞれ、2ケタ目から7ケタ目を表記するパターンがどちらかを示しています。
2 3 4 5 6 7
------------------
A A B A B B → 1ケタ目は 1
A A B B A B → 1ケタ目は 2
A A B B B A → 1ケタ目は 3
A B A A B B → 1ケタ目は 4
A B B A A B → 1ケタ目は 5
A B B B A B → 1ケタ目は 6
A B A B A B → 1ケタ目は 7
A B A B B A → 1ケタ目は 8
A B B A B A → 1ケタ目は 9
このように2~7文字目のパターンがAかBかによって、関接的に1ケタ目の値を得られるようにしています。
このような複雑な仕様とした理由については筆者もよくわかっていません。
(余談)同じ数字が同じパターンでない理由
この章も前章と同じ理由で余談としています。
筆者が以前、バーコードの構造を理解しようとして、いくつかのバーコードを見比べてみて混乱しました。というのは、同じ数字なのに、バーの巾が違っているところがあるのです。だからといって、全てがバラバラというわけではなく、同じ数字で同じパターンとなっているものもあります。
この理由は上のパターンAとパターンBが混在していることが1つの理由、もう一つは上下逆のパターンを検出できるようにするため、7文字目以降をパターンAとパターンBのいずれとも違うパターン(パターンC)で表記しているためです。
結局バーコードには、パターンAとBとCの3種の表記方法があり、それぞれ前頭の1ケタを識別するためや、上下逆を検出するためと、便利に使えるような工夫が施されていることがわかりました。
まとめ
バーコードの歴史は古く、1970年代にはルールが策定されていました。
現在、スーパーやコンビニで扱う商品のバーコードはJANコードと呼ばれるもので、国際的な枠組みに沿った13ケタのコード体系です。
このJANコード自体は一般財団法人流通システム開発センターによって重複が生じないように管理されています。
一方、生鮮食料品や量り売りをする商品のように、同センターで管理するのが不向きな商品については、自由に利用できる領域(先頭の2ケタが20~29)が規定されています。この範囲のJANコードについては、店舗側の都合の良いように自由に利用できます。
次にバーコードの構造についてです。
JANコードでは2本のバーの巾で1つの数字を示すのですが、このパターンが表記したい桁位置によってパターンA,B,Cの三種類があります。
このパターンの使い分けを行うことで、上下逆転の検出が行えますし、12ケタ分のバーコードだけで13ケタ分を表記するといった、使い勝手の良いシステムとなっています。
JANコードは今から40年以上前に考案されたシステムですが、現在も活用されている優れたバーコード方式と言えます。
今回はJANコードに代表されるバーコードについてお話をしました。
次回もお楽しみに。
(本稿は 2023年12月に作成しました)
このNoteは筆者が主宰するメルマガ「がんばりすぎないセキュリティ」からの転載です。
誰もが気になるセキュリティに関連するトピックを毎週月曜日の早朝に配信しています。
無料ですので、是非ご登録ください。
https://www.mag2.com/m/0001678731.html
また、公式サイトでも最新版を公開していますので、そちらもどうぞ。
https://www.egao-it.com/