国际物品编码协会(EAN)和美国统一代码委员会(UCC)将CODE-128码引入EAN/UCC系统,并作如下规定:起始符由一个START A/B/C 加一个辅助字符FNC1构成,以区别普通的CODE-128条码。EAN-128码仍然是非定长条码,每一个条码符号可表示的数据最少3位,最多32位,并且构成条码的码字数量不超过48个,整个条码的物理长度不超过165毫米。一个标准模块的宽度为1毫米,放大系数为0.25~1.2。
EAN-128码的编码规则
EAN-128码在表示数据的方法上采用了应用标识符系统(Application Identifier,简记为AI),使得EAN-128条码成为一种有含义的条码。应用标识符由2位到4位数字组成,每一组应用标识符数字的含义是预先定义好的,用来说明其后面的数字表示的内容。例如:应用标识符01表示贸易项目代码,10表示批号,11表示生产日期,13表示包装日期,15表示保质期等,则以下信息便可以只从数字上作出明确解释:
(01)16903128100250(11)091020(10)091050表示贸易项目代码为16903128100250,该批产品的生产日期为2009年10月20日,批号为091050;
(01)16903128100250(13)091020(15)100420表示贸易项目代码为16903128100250,该产品包装日期为2009年10月20日,保质期到2010年4月20日。
上面示例中应用标识符都放在括号中,是为了方便人眼识读,在条码中表示的时候是不使用括号的,目的是为了最大限度地减小条码的长度以便更多地表示数据内容。为了能区分各组数据的内容,要在每组数据之间插入一个分隔符,最后一组数据后不加分隔符,分隔符使用码字FNC1,译码后的数据以<GS>(ASCII码值为29的字符)表示分隔符。如上面的第一条数据用条码可以表示为:
|START C|FNC1|01|16|90|31|28|10|02|50|FNC1|11|09|10|20|FNC1|10|09|10|50|校验码|STOP|
一个条码中包含的数据组数越多,加入的分隔符就越多,也会增加条码的长度。为了进一步缩短条码的长度,又采取了对常用的应用标识符预定义长度的措施,预定义长度的应用标识符见下表:
*带括号的数字是预定义了长度但还没有定义含义的应用标识符。
如果数据中的应用标识符使用的是预定义长度的AI,则可以省去数据后的分隔符,如下面的例子
例1(01)16903128100250(13)091020(15)100420 用条码可以表示为
|START C|FNC1|01|16|90|31|28|10|02|50|13|09|10|20|15|10|04|20|校验码|STOP|
再看另外一个例子:
例2(02)16903128100250(37)100(10)091000S
|START C|FNC1|02|16|90|31|28|10|02|50|37|10|CODE B| 0 |CODE C|FNC1|10|09|10|00|CODE B|S|校验符|STOP|
因为(02)是预定义长度的应用标识符,所以(37)前不用加分隔符,而37是未定义长度的应用标识符,所以(10)前必须增加一个分隔符FNC1,
正是因为EAN-128以上的这些特点,使得128条码具有灵活性和多样性,相同的数据可以使用不同的编码规则,一般来说,使相同的数据生成的条码最短的是最优方案。但由于软件设计者的思路不同,即使条码长度完全一样,条码的条空结构也会不同,这也正是很多做条码的朋友感到困惑的地方。例如上面的例2,可以做成下面两种不同的条码:
|START C|FNC1|02|16|90|31|28|10|02|50|37|10|CODE B| 0 |CODE C|FNC1|10|09|10|00|CODE B|S|校验符|STOP|
|START C|FNC1|02|16|90|31|28|10|02|50|37|10|CODE A| 0 |FNC1|CODE C|10|09|10|00|CODE A|S|校验符|STOP|
两个条码的长度完全相同,扫描结果也完全相同,但条码符号中却有5处条空结构不同。有了上面的知识,我们不难理解,这两个条码符号都是最优方案。
CODE-128和EAN-128条码应用中容易出现的问题
1、注意分清应用范围
CODE-128条码可以用于任何管理系统中的自动识别,但EAN-128码必须用在EAN/UCC系统中,用来表示商品的储运单元或物流单元的信息,凡用EAN-128条码表示的内容必须符合EAN/UCC系统的规定,即带应用标识符的数据格式,否则就有可能造成条码生成错误或信息识读错误。
2、生成条码应选用专用条码软件
现在很多企业做条码都是与装潢图案一起送广告制作公司制作,而广告公司基本上是使用平面设计软件里的条码插件生成条码,制作质量良莠不齐。下图就是用这样的软件做的一个条码:
这个条码对编码规则使用错误,没有校验码,并且最后两位也不应该转换为B字符集把9、1单独表示。
也有一些朋友使用所谓条码字体生成条码,不要说质量难以保证,甚至连基本的正确性都保证不了。下图是一个用128条码字体做的条码:
条码提供者说条码不能识别,按图中数字做出来的也与原图不一样,经分析发现条码中存在很多错误,最下面一行是按条空结构分析出的数据。
错误一:使用了两个START C的起始符
错误二:若用C字符集则不能表示英文字母,且字母M重复,数据00多出一组;
错误三:没有经过字符转换就直接变为字符集C,未经转换又直接使用字符集A或B中的单个数字1;
错误四:条码结尾的B不知从何而来,且没有终止符。
3、使用EAN-128码必须系统地学习EAN/UCC的相关规则,不可一知半解,跟着感觉走。下图是一个EAN-128码的例子:
不晓得原作者是用什么软件生成的条码图,其中也是有多处错误。一是作者不知道<GS>就是码字FNC1在数据字符中的表示,在条码中又原样加入<、G、S、>四个字符;最后一个CODE A也是多此一举,因为CODE B中同样也包含数字。
4、字符集的选用
由于字符集A与字符集B中除了英文小写字母外,大部分符号是重叠的,所以一般情况下,如果条码包含字母、符号使用字符集B比较方便,当然如果条码中都是大写字母,使用字符集A与使用字符集B是一样的。如果数据的开头部分是4个或4个以上连续的数字,则必须要使用字符集C,数据中间如果有4个或4个以上连续的数字也要变换为字符集C。
上图是两个CODE-128条码,虽然是纯数字的数据,左图却选用了字符集B,尽管条码本身并没有错误,但是条码长度比使用字符集C的右图要长出许多。
下图是一个实际的EAN-128条码,前半部分都没有问题,但最后6位数字却没有按规定转换到字符集C,二次接单的条码设计人员更换了几个软件都没办法做出和原图一模一样的条码来,不得以上网求助。听过我的分析之后,他明白了其中的道理,但也无奈地表示,有些客户不管这些,只认定要和原来的一样。对此,我也只能表示无奈,毕竟不能要求每一个人都成为条码方面的专家。