EAN 码在表示数字 0-9 时使用了三种不同的编码模板。暂且称它们为 Tall A/B/C,因此,数字 0 在使用 Tall A 和 Tall B 时的编码是不同的,Tall C 是 Tall A 的逆向图像。EAN 条码总是要使用两到三个模板来编码,EAN8 使用了 Tall A 和 Tall C,EAN13 使用 Tall A,B,C。下面是每个条码数字与 ASCII 码字符的对照映射表(表 1):
Start | | Tall A | | Tall B | | Tall C |
数字 | 字符 | | 数字 | 字符 | | 数字 | 字符 | | 数字 | 字符 |
0 | ! | | 0 | A | | 0 | Q | | 0 | 0 |
1 | " | | 1 | B | | 1 | R | | 1 | 1 |
2 | # | | 2 | C | | 2 | S | | 2 | 2 |
3 | $ | | 3 | D | | 3 | T | | 3 | 3 |
4 | % | | 4 | E | | 4 | U | | 4 | 4 |
5 | & | | 5 | F | | 5 | V | | 5 | 5 |
6 | ' | | 6 | G | | 6 | W | | 6 | 6 |
7 | ( | | 7 | H | | 7 | X | | 7 | 7 |
8 | ) | | 8 | I | | 8 | Y | | 8 | 8 |
9 | * | | 9 | J | | 9 | Z | | 9 | 9 |
光有上面的映射表,不知道 EAN 的编码规则还是不行的。
EAN8
EAN8 编码总是以 [ 字符作为起始字符,随后的 4 个数据字符使用 Tall A 映射,中间插一个分隔字符 |,然后是使用 Tall C 映射的 3 个数据字符和一个检查和字符,最后有一个停止字符 ]
例如:09234574 的 EAN8 编码为 [ AJCD | 4574 ]
其实最后的这个检查和字符 4 是计算出来的,也就是说,有了前 7 位,第 8 位就可以计算出来。
EAN8 检查和的计算方法:
定义最右边的位为奇数位,前一位为偶数位,依次往左类推:
数据: 0 9 2 3 4 5 7
位置: O E O E O E O
奇数位和: 0 + 2 + 4 + 7 = 13, 13 * 3 = 39
偶数位和: 9 + 3 + 5 = 17
奇偶位和: 17 + 39 = 56
检查和:60 - 56 = 4 ( 60 是 56 向上取整到 10 的倍数 )
EAN13
EAN13 要稍微复杂一些,它总是以一个 Start(见前面的表1) 字符开始,接着一个使用 Tall A 映射的字符,随后的 5 个字符混合使用 Tall A,B 映射,中间加一个分隔符 |,后面的 5 个字符和检查和使用 Tall C 映射,最后是一个停止符 ]
关键是使用 A,B 混合映射的那 5 个字符,它们的映射关系取决于条码的第一个字符(绿色那个),这个对应关系如下表所示(表2):
Bit13 | Bit12 | Bit11 | Bit10 | Bit9 | Bit8 | Bit7 |
0 | A | A | A | A | A | A |
1 | A | A | B | A | B | B |
2 | A | A | B | B | A | B |
3 | A | A | B | B | B | A |
4 | A | B | A | A | B | B |
5 | A | B | B | A | A | B |
6 | A | B | B | B | A | A |
7 | A | B | A | B | A | B |
8 | A | B | A | B | B | A |
9 | A | B | B | A | B | A |
例如:条码 2923457890247 的 EAN13 编码过程为:
位置: 13 12 11 10 9 8 7 6 5 4 3 2 1
数据: 2 9 2 3 4 5 7 8 9 0 2 4 7
分解: 2 9 23457 890247
映射: # J CTUFX 890247
加分隔/停止字符,最后结果:#JCTUFX|890247]
EAN13 检查和的计算方法:
与 EAN8 的计算方法相同:
数据: 2 9 2 3 4 5 7 8 9 0 2 4
位置: E O E O E O E O E O E O
奇数位和: 9 + 3 + 5 + 8 + 0 + 4 = 29, 29 * 3 = 87
偶数位和: 2 + 2 + 4 + 7 + 9 + 2 = 26
奇偶位和: 87 + 26 = 113
检查和: 120 - 113 = 7
PS:
商业是最早应用条码技术的领域。在商业自动化系统中,商品条码是关键。
在国家标准GB/T 12904中,商品条码 (barcode for commodity)的被定义为用于标识国际通用的商品代码的一种模块组合型条码。
1970年美国超级市场委员会制定了通用商品代码UPC码,美国统一编码委员会(UCC)与1973年建立了UPC条码系统,并全面实现了该码制的标准化。UPC条码成功地应用于商业流通领域中,对条码的应用和普及起到了极大的推动作用。
UPC码的使用成功促使了欧洲编码系统(EAN)的产生。到1981年,EAN已发展成为一个国际性的组织,且EAN码与UPC码兼容。
EAN/UPC码作为一种消费单元代码,被用于在全球范围内唯一标识一种商品。
EAN码有两种版本——标准版和缩短版。标准版表示13位数字,又称为EAN13码,缩短版表示8位数字,又称EAN8。两种条码的最后一位为校验位,由前面的12位或7位数字计算得出。两种版本的编码方式可参考国标GB-12094-1998。
EAN码由前缀码、厂商识别码、商品项目代码和校验码组成。前缀码是国际EAN组织标识各会员组织的代码,我国为690、691和692;厂商代码是EAN编码组织在EAN分配的前缀码的基础上分配给厂商的代码;商品项目代码由厂商自行编码;校验码为了校验代码的正确性。在编制商品项目代码时,厂商必须遵守商品编码的基本原则:对同一商品项目的商品必须编制相同的商品项目代码;对不同的商品项目必须编制不同的商品项目代码。保证商品项目与其标识代码一一对应,即一个商品项目只有一个代码,一个代码只标识一个商品项目。
如听装健力宝饮料的条码为6901010101098,其中690代表我国EAN组织,1010代表广东健力宝公司,10109是听装饮料的商品代码。这样的编码方式就保证了无论在何时何地,6901010101098就唯一对应该种商品。
另外,图书和期刊作为特殊的商品也采用了EAN13表示ISBN和ISSN。前缀977被用于期刊号ISSN,图书号ISBN用978为前缀,我国被分配使用7开头的ISBN号,因此我国出版社出版的图书上的条码全部为9787开头。
下表列出了部分前缀码所代表的EAN组织。
EAN已分配给各编码组织的前缀码
前缀码 | 各编码组织所在国家(地区) | 前缀码 | 各编码组织所在国家(地区) |
00—13 | 美国和加拿大 | 609 | 毛里求斯 |
20—29 | 店内码(对无条码商品自行编码) | 611 | 摩洛哥 |
30—37 | 法国 | 613 | 阿尔及利亚 |
380 | 保加利亚 | 619 | 突尼斯 |
383 | 斯洛文尼亚 | 622 | 埃及 |
385 | 克罗地亚 | 625 | 约旦 |
387 | 波黑 | 626 | 伊朗 |
400—440 | 德国 | 64 | 芬兰 |
45、49 | 日本 | 690—692 | 中国 |
460—469 | 俄罗斯联邦 | 70 | 挪威 |
471 | 中国台湾 | 729 | 以色列 |
474 | 爱沙尼亚 | 73 | 瑞典 |
475 | 拉脱维亚 | 740 | 危地马拉 |
477 | 立陶宛 | 741 | 萨尔瓦多 |
479 | 斯里兰卡 | 742、744 | 洪都拉斯、哥斯达黎加 |
480 | 菲律宾 | 743 | 尼加拉瓜 |
481 | 白俄罗斯 | 745 | 巴拿马 |
482 | 乌克兰 | 746 | 多米尼加 |
484 | 摩尔多瓦 | 750 | 墨西哥 |
485 | 亚美尼亚 | 759 | 委内瑞拉 |
486 | 格鲁吉亚 | 76 | 瑞士 |
487 | 哈萨克斯坦 | 770 | 哥伦比亚 |
489 | 中国香港 | 773 | 乌拉圭 |
50 | 英国 | 775 | 秘鲁 |
520 | 希腊 | 777 | 玻利维亚 |
528 | 黎巴嫩 | 779 | 阿根廷 |
529 | 塞浦路斯 | 780 | 智利 |
531 | 马其顿 | 2784 | 巴拉圭 |
535 | 马耳他 | 786 | 厄瓜多尔 |
539 | 爱尔兰 | 789 | 巴西 |
54 | 比利时和卢森堡 | 80—83 | 意大利 |
560 | 葡萄牙 | 84 | 西班牙 |
569 | 冰岛 | 850 | 古巴 |
57 | 丹麦 | 858 | 斯洛伐克 |
590 | 波兰 | 859 | 捷克 |
594 | 罗马尼亚 | 860 | 南斯拉夫 |
599 | 匈牙利 | 869 | 土耳其 |
600—601 | 南非 | 893 | 越南 |
87 | 荷兰 | 899 | 印度尼西亚 |
880 | 韩国 | 90、91 | 奥地利 |
885 | 泰国 | 93 | 澳大利亚 |
888 | 新加坡 | 94 | 新西兰 |
890 | 印度 | 955 | 马来西亚 |