条码知识之十:EAN-128条码(下)
国际物品编码协会(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条码(下)的更多相关文章
- 条码知识之九:EAN-128条码(上)
EAN-128码,现称GS1-128码,是专用于GS1系统中的条码,可以标注商品的附加信息,在商品信息的标识.产品的跟踪与追溯中有广泛的用途. EAN-128码来自于CODE-128码,在字符集.条 ...
- 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网络知识 第十五节课 ...
- 逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式
逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式 一丶了解什么是结构体,以及计算结构体成员的对其值以及总大小(类也是这样算) 结构体的特性 1.结构体(struct)是由一系列具有相同类型或不 ...
- ERP条码解决方案,金蝶盘点机条码解决方案,应用PDA的信息化管理能给我们的生产管理带来怎么样的变化的探讨
ERP条码解决方案,金蝶盘点机条码解决方案,应用PDA的信息化管理能给我们的生产管理带来怎么样的变化的探讨. 当前越来越多的大大小小的中国企业已经接受了ERP的思想,大多数的商店,企业,工厂都会上一套 ...
- c++11-17 模板核心知识(十五)—— 解析模板之依赖型类型名称与typename Dependent Names of Types
模板名称的问题及解决 typename规则 C++20 typename 上篇文章c++11-17 模板核心知识(十四)-- 解析模板之依赖型模板名称 Dependent Names of Templ ...
- MySQL高级知识(十六)——小表驱动大表
前言:本来小表驱动大表的知识应该在前面就讲解的,但是由于之前并没有学习数据批量插入,因此将其放在这里.在查询的优化中永远小表驱动大表. 1.为什么要小表驱动大表呢 类似循环嵌套 for(int i=5 ...
- “全栈2019”Java第十六章:下划线在数字中的意义
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- java从基础知识(十)java多线程(下)
首先介绍可见性.原子性.有序性.重排序这几个概念 原子性:即一个操作或多个操作要么全部执行并且执行的过程不会被任何因素打断,要么都不执行. 可见性:一个线程对共享变量值的修改,能够及时地被其它线程看到 ...
- 基础知识《十》unchecked异常和checked异常
运行时异常在运行期间才能被检查出来,一般运行期异常不需要处理.也称为unchecked异常.Checked异常在编译时就能确定,Checked异常需要自己处理. checked 异常也就是我们经常遇到 ...
随机推荐
- 在美国,一名 Uber 司机能赚多少?
在美国,Uber 司机是最热门的职业.有了 uberX,任何有车一族都能成为司机.Uber 让我们很容易成为司机. 虽然 Uber 做不到赚得盆满钵满,但对于水深火热的司机这一行来说,多了许多盈利机会 ...
- Drupal7模块multiselect使用
Drupal二次开发的时候,我们时常要使用到多选列表,但是官方默认的多选下拉列表,是在不敢恭维如下图所示: 不过难看不可怕,Drupal有两万第三方模块做支撑,只有你想不到,没有找不到的. 功夫不负有 ...
- OpenCV 开发环境环境搭建(win10+vs2015+opencv 3.0)
OpenCV 3.0 for windows(下载地址:http://opencv.org/): 本测试中,OpenCV安装目录:D:\Program Files\opencv,笔者操作系统为64位. ...
- cocos2d-x3.9利用cocos引擎一键打包Android平台APK(C++小白教程)
链接地址:http://www.cocoachina.com/bbs/read.php?tid=333937 cocos2d-x3.9利用cocos引擎一键打包Android平台APK(C++小白教程 ...
- 10247 - Complete Tree Labeling(递推高精度)
Problem B Complete Tree Labeling! Input: standard input Output: standard output Time Limit: 45 secon ...
- virtualbox 中安装win7虚拟机
下载了win7镜像文件后,在virtualbox中装了几次都提示 windows faied to start,后来在网上找了些解决办法,在这记录下,免得下次又忘了 创建新的虚拟机: 1.安装virt ...
- PGA与SGA
当用户进程连接到数据库并创建一个对应的会话时,Oracle服务进程会为这个用户专门设置一个PGA区,用来存储这个用户会话的相关内容.当这个用户会话终止时,数据库系统会自动释放这个PAG区所占用的内存. ...
- LintCode-不同的子序列
题目描述: 给出字符串S和字符串T,计算S的不同的子序列中T出现的个数. 子序列字符串是原始字符串通过删除一些(或零个)产生的一个新的字符串,并且对剩下的字符的相对位置没有影响.(比如,“ACE”是“ ...
- ISO14443 ISO15693 ISO18000
[提要]射频标签的通信标准是标签芯片设计的依据,目前国际上与RFID相关的通信标准主要有:ISO/IEC 18000标准(包括7个部分,涉及125KHz, 13.56MHz, 433MHz, 860- ...
- Qt 4.6: A Quick Start to Qt Designer
Qt 4.6: A Quick Start to Qt Designer A Quick Start to Qt Designer Using Qt Designer involves four ba ...