在线生成条形码的解决方案(39码、EAN-13)
本文发布于 15 年前,部分内容可能已经失去参考价值。
公司有个项目是使用实体刷卡的会员管理系统,并为其它系统如餐饮系统、美发厅管理系统等提供统一的会员注册与信息管理。暂定使用一维条形码卡。
一般来说,商品最常用的编码是EAN-13,而非商品(如图书馆会员卡,驾驶证条码等)一般使用39码。
39码 在线测试地址:http://xoyozo.net/Tools/Code39
EAN-13 在线测试地址:http://xoyozo.net/Tools/EAN-13
39码
39码比较简单,条码以“*”为起始符和终止符,见下图:
它所能表示的字符包括:0~9 的数字,大写 A~Z 的英文字母,「+」,「-」,「*」,「/」,「%」,「$」,「.」,以及空格符(Space)等,共44组编码。
39码表:“0”对应白色空位,“1”对应黑色线条。
字元 | 逻辑型态 | 字元 | 逻辑型态 |
---|---|---|---|
A | 110101001011 | N | 101011010011 |
B | 101101001011 | O | 110101101001 |
C | 110110100101 | P | 101101101001 |
D | 101011001011 | Q | 101010110011 |
E | 110101100101 | R | 110101011001 |
F | 101101100101 | S | 101101011001 |
G | 101010011011 | T | 101011011001 |
H | 110101001101 | U | 110010101011 |
I | 101101001101 | V | 100110101011 |
J | 101011001101 | W | 110011010101 |
K | 110101010011 | X | 100101101011 |
L | 101101010011 | Y | 110010110101 |
M | 110110101001 | Z | 100110110101 |
字元 | 逻辑型态 | 字元 | 逻辑型态 |
---|---|---|---|
0 | 101001101101 | + | 100101001001 |
1 | 110100101011 | - | 100101011011 |
2 | 101100101011 | * | 100101101101 |
3 | 110110010101 | / | 100100101001 |
4 | 101001101011 | % | 101001001001 |
5 | 110100110101 | $ | 100100100101 |
6 | 101100110101 | . | 110010101101 |
7 | 101001011011 | 空白 | 100110101101 |
8 | 110100101101 | ||
9 | 101100101101 |
值得注意的是,39码生成的条形中,每个码之间有一个空位,经扫描枪测试,该空位与一个单位的线条宽度相等时,能确保被正确扫描。
代码见附件
EAN-13码
EAN-13码是由13位数字构成,其中最后一位为校验码:
左侧空白区 | 起始符 | 左侧数据符 | 中间分隔符 | 右侧数据符 | 校验符 | 终止符 | 右测空白区 |
9个模块 | 3个模块 | 42个模块 | 5个模块 | 35个模块 | 7个模块 | 3个模块 | 9个模块 |
校验码计算的步骤如下: 以 234235654652 为例:
数据码 | 校验码 | ||||||||||||
代码位置序号 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
数字码 | 2 | 3 | 4 | 2 | 3 | 5 | 6 | 5 | 4 | 6 | 5 | 2 | ? |
偶数位 | 3 | + | 2 | + | 5 | + | 5 | + | 6 | + | 2 | ||
奇数位 | 2 | + | 4 | + | 3 | + | 6 | + | 4 | + | 5 |
① 从序号2开始,将所有偶数位的数字代码求和,得出S1; S1=3+2+5+5+6+2=23
② 从序号3开始,将所有奇数位的数字求和,得出S2; S2=2+4+3+6+4+5=24
③ S3=S1*3+S2; S3=23*3+24=93
④ C=10-(S3的个位数),得到校验码C的值。并且当S3的个位数为0时,C=0。 C=10-3=7
EAN码的编码规则:
数字符 |
左侧数据符 | 右侧数据符 | |
A | B | C | |
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 |
(关于左侧数据符,网络上的资料均显示A3及B6为6位数,经本人实践亲自查证,已修正)
起始符:101
中间分隔符:01010
终止符:101。
A、B、C中的“0”和“1”分别表示具有一个模块宽度的“空”和“条”。
因为左侧数据编码方式有两种,要按照前置码选其中一种,如表:
前置字符 | 左侧数据符编码规则的选择 | |||||
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 |