超市商品上的条形码扫一下就能弹出价格,靠的是一套把数字编码成"粗细不同的黑白条纹"的标准规则,而且条码最后一位数字通常不是随便填的,是用来检测扫描错误的校验位。
条形码的基本原理是用黑白条纹的宽度组合来编码数字或字符——每一位数字对应一组固定的黑白条纹宽度模式(不同标准的具体编码规则不同),扫描枪或摄像头通过检测光线反射强度的变化(黑条吸光、白条反光),读出条纹的宽窄序列,再按标准的编码表反查出对应的数字。这本质上和摩斯电码"用点划序列编码字母"是同一类思路——用一种物理信号的模式变化,编码出离散的符号序列。
EAN-13(European Article Number,13 位)是全球商品零售最常见的条码标准,13 位数字里前面几位是国家/地区代码(比如 690-699 分配给中国大陆),中间是厂商代码和商品代码,最后 1 位是校验位。EAN-13 只能编码数字,如果需要编码字母或更长的字符串,则要用 CODE128 这类支持全 ASCII 字符集的条码标准——不同条码标准的选择,取决于要编码的内容类型和应用场景(零售商品普遍用 EAN-13,物流仓储、工业标签更多用 CODE128)。
EAN-13 的最后一位数字是根据前 12 位数字按固定算法计算出来的校验位,作用和身份证号码校验位类似——检测扫描或人工输入过程中是否出现了单个数字错误。计算规则是把前 12 位数字交替乘以权重 1 和 3 再求和,取和对 10 取余后用 10 减去余数(结果为 10 时取 0)得到校验位。如果扫描出来的条码数据算出的校验位和条码最后一位不一致,系统就能判断这次读取或输入出现了错误,需要重新扫描——这也是为什么手动输入条码数字时,系统经常会即时校验并提示"编号错误"。
条形码(一维码)只在一个方向(水平方向)上编码信息,能存储的数据量有限(通常只有十几位数字或字符);二维码 在水平和垂直两个方向上都编码信息,理论存储密度大得多,还内置了纠错机制,能存下网址、文本等更长的内容。两者的技术定位不同:一维码更适合"固定格式、少量数字信息"的场景(商品编号、图书 ISBN),因为设备成本更低、扫描速度更快;二维码适合"内容更丰富、需要容错能力"的场景。