国际物品编码协会(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,二次接单的条码设计人员更换了几个软件都没办法做出和原图一模一样的条码来,不得以上网求助。听过我的分析之后,他明白了其中的道理,但也无奈地表示,有些客户不管这些,只认定要和原来的一样。对此,我也只能表示无奈,毕竟不能要求每一个人都成为条码方面的专家。

            

条码知识之十:EAN-128条码(下)的更多相关文章

  1. 条码知识之九:EAN-128条码(上)

     EAN-128码,现称GS1-128码,是专用于GS1系统中的条码,可以标注商品的附加信息,在商品信息的标识.产品的跟踪与追溯中有广泛的用途. EAN-128码来自于CODE-128码,在字符集.条 ...

  2. centos Linux系统日常管理2 tcpdump,tshark,selinux,strings命令, iptables ,crontab,TCP,UDP,ICMP,FTP网络知识 第十五节课

    centos  Linux系统日常管理2  tcpdump,tshark,selinux,strings命令, iptables ,crontab,TCP,UDP,ICMP,FTP网络知识 第十五节课 ...

  3. 逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式

    逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式 一丶了解什么是结构体,以及计算结构体成员的对其值以及总大小(类也是这样算) 结构体的特性 1.结构体(struct)是由一系列具有相同类型或不 ...

  4. ERP条码解决方案,金蝶盘点机条码解决方案,应用PDA的信息化管理能给我们的生产管理带来怎么样的变化的探讨

    ERP条码解决方案,金蝶盘点机条码解决方案,应用PDA的信息化管理能给我们的生产管理带来怎么样的变化的探讨. 当前越来越多的大大小小的中国企业已经接受了ERP的思想,大多数的商店,企业,工厂都会上一套 ...

  5. c++11-17 模板核心知识(十五)—— 解析模板之依赖型类型名称与typename Dependent Names of Types

    模板名称的问题及解决 typename规则 C++20 typename 上篇文章c++11-17 模板核心知识(十四)-- 解析模板之依赖型模板名称 Dependent Names of Templ ...

  6. MySQL高级知识(十六)——小表驱动大表

    前言:本来小表驱动大表的知识应该在前面就讲解的,但是由于之前并没有学习数据批量插入,因此将其放在这里.在查询的优化中永远小表驱动大表. 1.为什么要小表驱动大表呢 类似循环嵌套 for(int i=5 ...

  7. “全栈2019”Java第十六章:下划线在数字中的意义

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  8. java从基础知识(十)java多线程(下)

    首先介绍可见性.原子性.有序性.重排序这几个概念 原子性:即一个操作或多个操作要么全部执行并且执行的过程不会被任何因素打断,要么都不执行. 可见性:一个线程对共享变量值的修改,能够及时地被其它线程看到 ...

  9. 基础知识《十》unchecked异常和checked异常

    运行时异常在运行期间才能被检查出来,一般运行期异常不需要处理.也称为unchecked异常.Checked异常在编译时就能确定,Checked异常需要自己处理. checked 异常也就是我们经常遇到 ...

随机推荐

  1. Webserver管理系列:9、创password重设盘

    网络时代需要记录password太多.一不留神可能会忘记.是否server的password忘记将是一件非常麻烦的事情. Windows Server 2008 它为我们创造password重设盘功能 ...

  2. SQL Server使用LIKE运算符进行匹配查询

    在查询的过程中,如果遇到不能明确的指明查询的限定条件时,就会用到LIKE运算符进行模式匹配查询.在查询时可以使用如下几个通配符: %:包含零个或多个字符的任意字符串 —(下划线):任何单个字符 []: ...

  3. table边框不显示

    今日在做报表的时候发现,最后一行隐藏后整个报表的下边框会不显示,猜测是td的边框隐藏后但table并未设置边框,导致下边框没有出现.因此设置了table边框后问题解决.table和td的边框关系如下实 ...

  4. HDU2005-第几天

    描述: 给定一个日期,输出这个日期是该年的第几天. 代码: #include<stdio.h> #include<string.h> #include<iostream& ...

  5. MicroStrategy笔试

    1. coding判定二叉树是否是有序二叉树 2. 一个有序数组A(buffer足够大),和一个有序数组B,设计算法,merge两个数组后有序,不使用任何额外的内存空间 3. 100个点灯问题,初始状 ...

  6. PGA_AGGREGATE_TARGET 原理

    PGA_AGGREGATE_TARGET参数的理解 PGA结构图:                                   在Oracle9i之前,PGA的计算和控制都是比较复杂的事情,从 ...

  7. fiddler---使用方法1--抓取手机app包

    1.首先fiddler设置

  8. 05-C语言运算符

    目录: 一.进制转换 二.常量 三.sizeof 四.运算符 五.赋值运算符 六.自增减运算符 七.关系运算符 八.逻辑运算符 九.取址寻址运算符 回到顶部 一.进制转换 1 进制转换是人们利用符号来 ...

  9. 求1+2+...+n

    题目:求1+2+…+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字以及条件判断语句(A?B:C). 程序很简单,就看想到想不到了.悲剧,我属于后者... 算 ...

  10. Javascript中的位运算符和技巧

    ECMAScript 整数有两种类型,即有符号整数(允许用正数和负数)和无符号整数(只允许用正数).在 ECMAScript 中,所有整数字面量默认都是有符号整数,这意味着什么呢? 有符号整数使用 3 ...