POSレジで使われているJANコード(EANコード)について調べたので書き留めておきます。
JANコードの仕様
JANコードには13桁の標準コードと8桁の短縮コードがある。
それぞれでバーコード化の仕方が少し異なる。
標準コード(13桁)
標準コードの場合以下の構成になっている。
先頭から12桁がデータ、1桁がチェックデジットになっている。
短縮コード(8桁)
短縮コードの場合以下の構成になっている。
先頭から7桁がデータ、1桁がチェックデジットになっている。
チェックデジット
計算方法は以下の通り。
- 最下位から見て奇数桁と偶数桁に分けて合計する
- 奇数桁を3倍し偶数桁と合計する
- 10から1の位の値を減じる
- 3.の値が10ならば0、それ以外ならばその値がチェックデジット
例) 490801153240
- $4 + 0 + 0 + 1 + 3 + 4 = 12$ (偶数桁)
$9 + 8 + 1 + 5 + 2 + 0 = 25$ (奇数桁) - $25 \times 3 + 12 = 87$
- $10 - 7 = 3$
- $3$
例) 4519176
- $4 + 1 + 1 + 6 = 12$ (奇数桁)
$5 + 9 + 7 = 21$ (偶数桁) - $12 \times 3 + 22 = 57$
- $10 - 7 = 3$
- $3$
JANバーコードの仕様
バーコードは左から
- レフトマージン
- レフトガードバー
- レフトデータバー
- センターバー
- ライトデータバー チェックデジットバー
- ライトガードバー
- ライトマージン
に分かれている
単位
- モジュール
- バーコードの1番細い線または空白が1モジュール
- キャラクタ
- 数字1文字が1キャラクタ
各部位(標準コード)
| 部位 | 幅 | 説明 |
|---|---|---|
| レフトマージン | 11モジュール以上 | 左側の余白 |
| レフトガードバー | 3モジュール | 左側の基準線 |
| レフトデータバー | 42モジュール 6キャラクタ |
左側のデータ |
| センターバー | 5モジュール | 中央の基準線 |
| ライトデータバー チェックデジットバー |
42モジュール 6キャラクタ |
右側のデータ チェックデジット |
| ライトガードバー | 3モジュール | 右側の基準線 |
| ライトマージン | 7モジュール以上 | 右側の余白 |
各部位(短縮コード)
| 部位 | 幅 | 説明 |
|---|---|---|
| レフトマージン | 7モジュール以上 | 左側の余白 |
| レフトガードバー | 3モジュール | 左側の基準線 |
| レフトデータバー | 28モジュール 4キャラクタ |
左側のデータ |
| センターバー | 5モジュール | 中央の基準線 |
| ライトデータバー チェックデジットバー |
28モジュール 4キャラクタ |
右側のデータ チェックデジット |
| ライトガードバー | 3モジュール | 右側の基準線 |
| ライトマージン | 7モジュール以上 | 右側の余白 |
符号化(標準コード)
最初の1桁目(プレフィックスキャラクタ)の数値に応じて奇数パリティまたは偶数パリティを組み合わせて用いて符号化する。
例) 4908011532403
1桁目(プレフィックスキャラクタ)が4だからOEOOEEで符号化する。
レフトデータバー908011、ライトデータバー532403に分割する。
下記の符号化テーブルに当てはめて符号化する。
レフトデータバー9: 左側のデータキャラクタ 奇数パリティ 9 -> 0001011
レフトデータバー0: 左側のデータキャラクタ 偶数パリティ 0 -> 0100111
レフトデータバー8: 左側のデータキャラクタ 奇数パリティ 8 -> 0110111
...(中略)...
ライトデータバー4: 右側のデータキャラクタ 4 -> 1011100
ライトデータバー0: 右側のデータキャラクタ 0 -> 1110010
チェックデジットバー3: 右側のデータキャラクタ 3 -> 1000010
レフトデータバー: 0001011_0100111_0110111_0001101_0110011_0110011
ライトデータバー: 1001110_1101100_1100110_1011100_1110010_1000010
左右のマージン、左右のガードバー、センターバーを含めて符号化する。
00000000000_101_000101101001110110111000110101100110110011_01010_100111011011001100110101110011100101000010_101_0000000
0を白、1を黒で画像化すると一般的なバーコードになる。
高さは適当に50pxとした。

符号化(短縮コード)
奇数パリティを用いて符号化する。
短縮コードの場合はプレフィックスキャラクタを使わない。
例) 45191763
レフトデータバー4519、ライトデータバー1763に分割する。
下記の符号化テーブルに当てはめて符号化する。
レフトデータバー4: 左側のデータキャラクタ 奇数パリティ 4 -> 0100011
レフトデータバー5: 左側のデータキャラクタ 奇数パリティ 5 -> 0110001
レフトデータバー1: 左側のデータキャラクタ 奇数パリティ 1 -> 0011001
...(中略)...
ライトデータバー7: 右側のデータキャラクタ 7 -> 1000100
ライトデータバー6: 右側のデータキャラクタ 6 -> 1010000
チェックデジットバー3: 右側のデータキャラクタ 3 -> 1000010
レフトデータバー: 0100011_0110001_0011001_0111011
ライトデータバー: 1100110_1000100_1010000_1000010
左右のマージン、左右のガードバー、センターバーを含めて符号化する。
0000000_101_0100011011000100110010111011_01010_1100110100010010100001000010_101_0000000
0を白、1を黒で画像化すると一般的なバーコードになる。
高さは適当に50pxとした。

符号化テーブル
| 部位 | ビット |
|---|---|
| 空白 | 0 |
| 黒線 | 1 |
| 左右ガードバー | 101 |
| センターバー | 01010 |
| 10進数 | 左側のデータキャラクタ 奇数パリティ |
左側のデータキャラクタ 偶数パリティ |
右側のデータキャラクタ |
|---|---|---|---|
| 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 |
| プレフィックスキャラクタ | データキャラクタの組み合わせ |
|---|---|
| 0 | OOOOOO |
| 1 | OOEOEE |
| 2 | OOEEOE |
| 3 | OOEEEO |
| 4 | OEOOEE |
| 5 | OEEOOE |
| 6 | OEEEOO |
| 7 | OEOEOE |
| 8 | OEOEEO |
| 9 | OEEOEO |
| Oが奇数パリティ、Eが偶数パリティ |
JavaScriptでの実装例
See the Pen EAN/JAN Barcode by Dolphin (@dolphin0809) on CodePen.
参考資料
JAN/EANコード規格 - バーコードとは? - バーコード情報サイト(日栄インテック) 2021/01/21 閲覧
