バーコードの数学 — EAN-13 のチェックデジットとモジュール設計はなぜこうなったのか
BBUSINESS
ビジネス(更新: 2026-10-17)9 分で読める

バーコードの数学 — EAN-13 のチェックデジットとモジュール設計はなぜこうなったのか

コンビニでレジに通す商品のバーコード — あの白黒の縞模様は、ただの「線の太さ」で数字を表しているわけではありません。EAN-13(日本の標準タイプのJANシンボル)と呼ばれるこの規格には、スキャナが上下逆さまに読んでも正しくデコードできる仕組み、1桁の入力ミスを100%検出するチェックデジット、そしてGS1の割当ルールに基づく商品識別の仕組みがあります。番号であるGTINと、それを機械で読むためのバーコードシンボルは別物です。チェックデジットが正しくても、正式な割当や商品の真正性は証明できません。本記事では、バーコードの物理構造と数学を一次資料から整理します。

#バーコード#EAN-13#JAN#チェックデジット#GS1

バーコードの誕生 — 1974年6月26日、最初にスキャンされた商品

バーコードの原型は1952年、Joseph Woodland と Bernard Silver が取得した米国特許(US 2,612,994)に遡ります。この特許には平行線と同心円の符号例が示されており、後のUPCと同じ規格ではありません。

転機は1973年、米国の食料品業界団体がUniversal Product Code (UPC)を標準規格として採択したことです。IBMのGeorge Laurer が設計したUPC-Aは12桁の数字を白黒のバーで表現する方式で、1974年6月26日、オハイオ州トロイのMarsh SupermarketでWrigley's Juicy Fruit ガムが小売店のレジで初めてUPCバーコードをスキャンされた商品として知られています。試作装置での実験を含む「世界初の読取り」という意味ではありません。

その後、UPCを基礎に国際的な番号体系として13桁へ拡張されたのがEAN-13です。日本のJANコードには13桁の標準タイプと8桁の短縮タイプがあり、対応するシンボルはそれぞれEAN-13とEAN-8です。本記事は13桁を中心に扱います。現在はGS1が番号体系を管理しています。

EAN-13 の13桁構造

通常のGS1事業者コードから設定するGTIN-13は、以下の要素で構成されます。GS1事業者コードの桁数に応じて商品アイテムコードの桁数が変わるため、固定位置だけから事業者と商品を分割することはできません。

表が収まらない場合は、左右にスクロールできます。

位置桁数名称例(4901234567894)
1〜12桁目12GS1事業者コード + 商品アイテムコード490123456789
13桁目1チェックデジット4

この番号は計算用の例であり、実際の商品への使用権や未使用の番号であることを示しません。ISBNなどの特別な番号体系や限定流通用番号まで、上表の分割を一律に当てはめないでください。

GS1プリフィックス450〜459と490〜499はGS1 Japanに割り当てられていますが、商品の原産国を示すものではありません。商品は世界のどこで製造されていても、番号を割り当てたGS1加盟組織側のプリフィックスで始まります。

GS1 Japanが貸与するGS1事業者コードは7桁・9桁・10桁があり、商品アイテムコードと合わせた最初の12桁にチェックデジット1桁を加えてGTIN-13を作ります。

チェックデジットの計算 — mod10 加重アルゴリズム

13桁目のチェックデジットは、入力ミスやスキャンエラーを検出するための数字です。計算方法は以下の通り:

  1. 最初の12桁を左から順に並べる
  2. 奇数位置(1, 3, 5, ... 番目)の数字に ×1
  3. 偶数位置(2, 4, 6, ... 番目)の数字に ×3
  4. すべての積を合計する
  5. 合計を10で割った余りを求める
  6. (10 − 余り) mod 10 がチェックデジット

具体例: 4 9 0 1 2 3 4 5 6 7 8 9

×1: 4+0+2+4+6+8 = 24
×3: 9+1+3+5+7+9 = 34 → ×3 = 102
合計: 24 + 102 = 126
126 mod 10 = 6
チェックデジット = (10 − 6) mod 10 = 4

この「1と3の交互加重」方式は、隣接する2桁の入れ替え(transposition error)を高い確率で検出できます。例えば「48」を「84」と打ち間違えると、加重の切り替わりによって合計値が変わり、チェックデジットが一致しなくなります。

ただし、この方式ではすべての入れ替えを検出できるわけではありません。具体的には、異なる隣接数字の差が5である入れ替え(0↔5、1↔6、2↔7、3↔8、4↔9)は検出できません。例えば 4901234567894 と 9401234567894 はどちらもチェックを通過します。固定長の正しい13桁から1桁だけを別の数字へ変える場合は、チェック桁自身の変更も含めて100%検出できます。これは誤りを訂正する機能ではなく、複数桁の変更や正規商品の証明にも対応しません。

次のJavaScriptは12桁のASCII数字文字列を受け取り、チェック桁を返す学習例です。先頭0を失わないよう、番号は数値ではなく文字列で扱います。

function ean13CheckDigit(payload) {
  if (typeof payload !== "string" || !/^[0-9]{12}$/.test(payload)) {
    throw new TypeError("Expected exactly 12 ASCII digits");
  }
  const sum = [...payload].reduce(
    (total, digit, index) => total + Number(digit) * (index % 2 === 0 ? 1 : 3),
    0
  );
  return String((10 - sum % 10) % 10);
}
console.log(ean13CheckDigit("490123456789")); // "4"

学習用の検算と、正式な商品番号の設定・印刷検証は別です。NanTooのバーコード生成でも番号の割当や商品の真正性は確認できません。ITF-14出力はベアラバーを含まない簡易シンボルであり、商用印刷の規格適合保証ではありません。

バーの物理構造 — モジュールとパリティ

EAN-13のバーコードは、最小単位の幅を「1モジュール」として、直接符号化する12桁をそれぞれ7モジュール幅の白黒パターンで表現します。残る先頭桁の表し方は後述します。全体の構造は:

表が収まらない場合は、左右にスクロールできます。

領域モジュール数役割
クワイエットゾーン(左)11以上スキャナに「ここからバーコード開始」を知らせる空白
スタートガード3 (101)読み取り開始位置
左データ(6桁)427モジュール × 6桁
センターガード5 (01010)左右データの区切り
右データ(6桁)427モジュール × 6桁
エンドガード3 (101)読み取り終了位置
クワイエットゾーン(右)7以上終端の空白

合計 95モジュール(ガード含む、余白を除く)で、最小余白を含めた横幅は 113モジュール です。1モジュールの実幅をXとすると左11X・右7Xの空白が必要です。これは横方向の構成であり、印刷時のX寸法、バーの高さ、コントラスト、印刷品質の確認を代替しません。表の根拠: GS1 General Specifications Release 26.0 §5.2.3.4–5、§5.2.6.3。

各数字には3種類のエンコーディングパターンがあります。ここで1は黒、0は白を表し、パリティは数字の奇数・偶数ではなく、7モジュール中の黒モジュール数の奇数・偶数です。以下のL/G/RはGS1の集合A/B/Cに対応します:

  • L コード(奇数パリティ): 左側で使用。白スペースから始まる
  • G コード(偶数パリティ): 左側で使用。白スペースから始まる
  • R コード: 右側で使用。L コードの白黒反転

数字0の例ではLは 0001101、Gは 0100111、Rは 1110010 です。RはLの白黒反転、GはRの左右反転です。

1桁目は独立した7モジュールのバーとしては印刷されず、左側6桁のLコードとGコードの組み合わせパターンで暗黙的に表現されます。例えば先頭4なら左6桁は LGLLGG、先頭0なら LLLLLL です。先頭0はGTIN-12を表すために予約されています。これによりUPCとの互換性を保ちます。

なぜ上下逆さまでも読めるのか

EAN/UPCは左右どちらからも復号できる構造です。ただしバー全体を横切る走査、十分な余白・印刷品質、対応するスキャナが必要で、どんな角度や破損状態でも必ず読めるという意味ではありません。この仕組みは以下の設計によります:

  • ガードパターンの対称性: スタートガード(101)とエンドガード(101)は同一。スキャナはどちらから入っても「ガード」を認識できる
  • 符号集合と順序の組合せ: 右側のRを逆方向から読むとGの並びになります。左側にはLとGの両方があり得るため、単一文字の奇数・偶数だけでは方向を決めません。ガードの位置、符号集合の組合せ、桁数、チェックデジットを合わせて検証します
  • センターガード(01010): 左右の区切りを示す。逆読みでも同じパターン

つまり、スキャナは「ガードと符号の構成を照合し、走査方向に応じて桁順を復元する」という手順で処理します。レジでバーコードの向きを気にせずスキャンできるのは、この設計のおかげです。

EAN-13以外のバーコード規格

用途によってさまざまな規格が使い分けられています:

表が収まらない場合は、左右にスクロールできます。

規格桁数主な用途
EAN-88桁表示スペースが限られる小型商品向け。GTIN-13の単純な切り詰めではなく、GS1加盟組織が個別に割り当てるGTIN-8などの制度を使う。GS1 Japanにはワンオフキーと短縮タイプ事業者コードによる設定方式がある
UPC-A12桁北米で広く使用。12桁のGTIN-12の先頭に0を付けると13桁表記になる。任意のGTIN-13をUPC-Aへ短縮できるわけではない
Code 128可変長英数字・記号対応。物流ラベル、業務帳票
Code 39可変長英大文字・数字・一部記号に対応する業務用コード
ITF-1414桁集合包装などにGTIN-14を表示。段ボールへの印刷に適するが、ベアラバーなどの要件と品質検証が必要
Codabar (NW-7)可変長数字・一部記号を扱い、開始・終了文字(A〜D)を付ける。図書館などの既存システムで使用

1次元バーコードの限界は格納できる情報量の少なさです。EAN-13は13桁の数字のみ、Code 128は可変長ですが、データが増えるほど横長になり、ラベル幅・最小線幅・読取機器が制約になります。「数十文字」という全用途共通の上限ではありません。この制約を超えるために登場したのが、QRコードやData Matrixなどの2次元コードです。

まとめ

  • EAN-13(JANシンボル)で表すGTIN-13は GS1事業者コード + 商品アイテムコード + チェックデジット の13桁構成
  • チェックデジットは mod10 の 1-3 交互加重。1桁の書き間違いを 100% 検出
  • 直接符号化する12桁は各 7モジュール幅。先頭桁は別方式で表し、ガードを含めて95、最小余白込みで113モジュール
  • 先頭桁はバーとして印刷されず、左6桁の L/G パリティパターン で暗黙的に表現(UPC互換のための設計)
  • ガード・符号集合・桁順の構成により、左右どちらからも復号可能。実際の読取りには印刷と走査条件が必要
  • 1973年のUPC採択、1974年の小売店での初スキャンを経て、GS1の国際的な商品識別体系へ発展

参考文献・ソース

記事作成に関する注記

本記事は AI(大規模言語モデル)を編集補助として活用して作成しています。 公開前に編集者が内容を確認していますが、事実誤認・仕様の解釈ミス・最新情報との齟齬が含まれる可能性があります。 重要な判断を行う際は、本文中の一次ソースや公式ドキュメントを必ずご自身でご確認ください。 誤りにお気づきの場合は、お問い合わせフォームよりご連絡いただけると助かります。

🔧 関連ツール

📚 関連記事