急需EAN128Aai条形码插件AI插件

此文主要解释了什么是GS1-128为何叫莋GS1-128,以及详细解析了AI和FNC1


GS1是一个非盈利组织

GS1组织的目的就是去设计和实现一些标准,以提高供应与需求链的可视化以效率 目前已经开发叻一个系统,叫做GS1 System是一系列标准的总称。

  1. 条码用于商品的自动识别系统

  2. 用RFID技术来实现产品追踪

GS1负责维护一堆数据标识符(data identifier),即前缀碼(code prefixe)用于其成员将它们分配给对应的成员公司,使这些公司可以去创建与GS1标准相兼容的识别键值(identification key)

GS1定义的这些规范,其实是和ISO和IEC楿关的对应关系就是:

另外,GS1是整个一个系统或者说架构,其框架内部所包含的条码可以有很多种。而GS1-XXX的命名其中XXX就是GS1框架内部嘚所采用的字符集的名字。即不同的内部的条码XXX对应不同的GS1-XXX。比如内部的条码是Code 128的叫做GS1-128,而内部是DataBar的就叫做GS1-DataBar,等等

其中内部的条碼,说白了就是对条码的数据进行编码解码出来,就是对应的数据所以,此GS1框架中的条码也被称作Data Carriers ,即数据携带者即不同的条码苻号集,进行不同的编码但归根结底,都是为了携带数据

GS1-128,在Code 128字符集中的起始符后如果是Code 128字符集中的FNC1,那么就说明此条码是GS1的条码

GS1-128条码的格式,规范中的解释为:

如果了解Code 128字符集的话可以看出,此GS1-128整个格式和Code 128没啥区别,只是起始位后面多了个FNC1字符表示此条码為GS1-128,然后其中所表示的数据都是AI而已。

    1. 特殊在于GS1-128在普通Code 128的起始位后多了个FNC1,表示此条码为GS1-128条码然后对于普通Code 128中的条码所表示的是普通数据,而GS1-128中的条码所表示的是AI加上对应的数据

前面介绍过了,GS1是个框架内部条码的符号集不同,而叫法不同

Expanded等符号集,允许在商品条目数据之前添加一些描述性的信息而AI,应用标识符就是其具体表现形式。即在你条码数据之前加上一些标识,来对你的商品条目进行额外描述比如说明某商品多重,有多少个保质期是多少等等,诸如此类的信息

简言之,AI就是商品条目的前缀用于描述商品條目的某些信息的条码。

说白了AI还是条码,只是一种特殊条码用于描述商品某些特性而已。

但是由于条码中 不方便弄出像人类文字┅样的那么多字母,组成一句话来说明某个商品的特点而只能是条码的数字。

举例来说用人类语言来说明商品的生产日期是2011年1月1日的話,那么就可以表述为“此商品的生产日期是2011年1月1日”但是要是用条码来表示,就不方便把这么多蚊子都编码成条码然后打印上去,這样效率太低了

所以,会有个专门的组织去定义一些规矩,即某个几个数字前缀代表某种含义,比如此处就用两位数11来表示生产ㄖ期,然后后面跟着YYMMDD即,表示生产日期是2011年1月1日合起来就是,而实际常将AI用括号括起来就写成(11),这样将对应的这些数字,用條码去表示即可,然后ai条形码插件解码软件去解码后就可以得到这一串数字,然后解析成对应的含义

AI用不同的数字来表示不同的含義,最少2个数字最多有4个数字。其不同数字所表示的含义见下表:


  1. 上述中的YYMMDD,即年份月份日期如果只要求YYMM,即年份和月份没有要求日子的话,那么DD就自动填充为00

  2. 上面那些310-369390-393的第四位的数字,表示小数点的位数

  3. FNC1是在数据中间的话是用于区分可变长度的AI,比如如果你昰30后面最多可以有8位数字来表示产品数量但是你只有4个数字,比如1000那么此时就要跟一个FNC1字符,告诉解码程序此变长的AI到此结束,后媔的是其他AI的内容了

  4. 上述部分AI的描述中的FNC1好像不太正确,比如8100因为本身是固定长度,不需要FNC1去区分

之前一直以为FNC1和其他字符一样,昰ASCII的某个字符但是具体是对应ASCII的某个字符,也还是没搞懂而关于FNC1到底是哪个ASCII的字符,同样的困惑这人也遇到了:

但是后来才发现自巳上述理解,是错的

FNC1是Code 128字符集中的一个字符,是个特殊字符在某些情况下,起到一定控制的作用

FNC1不是ASCII字符集中(可见或非可见)的芓符。

需要多说明一点的是ASCII中的,共0-0xFF,256个字符其中0-0x1F共32个控制字符,叫做不可见字符余下0x20-0xFF就是我们常见的大小写字母,数字常见符号等等,称作可见字符

而FNC1本身就不是属于ASCII中的,所以也不是ASCII中的那种不可见的控制字符对此,需要特别注意不要再搞混淆了。

虽然作為第一个字符位置的FNC1不应该传输出来但是作为具体的解析ai条形码插件的程序或解码库来说,其也可以选择在输出ai条形码插件数据的时候把第一个FNC1传输出来,即表示出来

但是对于第一个FNC1的标示的话,有个问题因为上面解释了,FNC1不是ASCII字符集中的字符所以也没法打印出來,所以对此,不同的ai条形码插件软件或解码库的具体实现又都不太一样,都是自己定义一个ASCII中的某个字符一般是大于128=0x80的某个ASCII字符來表示此FNC1。

由于FNC1不是ASCII的字符集中的字符而且根据这里的说明:

目前已经找到的一些具体做法是:

对于FNC1,除了第一个的FNC1之后出现的FNC1,即茬Data数据中出现的FNC1所起的作用就和第一个FNC1一样了,是用于分割可变长度的AI(Application Identifier应用标识符)。

AI中有固定长度的,所以有了开始的AI数字(2箌4个)就可以知道后面有多少位数字,是对应的此AI的数据但是对于可变长度的话,后面不知道有几位数据是此AI的数据所以要加上一個FNC1来用于区分可变字符的数据和其后的其他的AI。

(其中也有对此处的FNC1起的作用,叫做域分隔符(Field Separator)的)

此处用GS来表示FNC1,也很好理解洇为如果把不同的AI看作是一个组的话,那么正好用GS组分隔符来区分不同的组

所以,此处传输出来的数据的话原先的ai条形码插件的字符集中的FNC1,就被解码器替换为GS字符=0x1D=29输出了即二进制值是0x1D了。

所以简单总结一下FNC1就是:

本身是Code 128等字符集中的一个特殊字符本身就不属于ASCII字苻集,也就不是ASCII中的某个字符

FNC1放在GS1-128字符集中的作用呢,主要就是两个:

    即放在Start字符后的处于符号集中的第二个位置,在数据之前此處的作用是,标识此符号集是GS1-128字符集(之前被称为UCC/EAN-128)

    即数据中间有FNC1的话解码器就知道此FNC1是用于区分可变长度的AI和其他AI,然后就会将其替換为GS字符然后同ai条形码插件的数据一起输出

举个例子来说明FNC1的含义:

比如一个GS1-128的ai条形码插件,内容是:

先来说明按照GS1-128的格式的话,对應的内容从左到右依次是:

  1. (数据中间的)FNC1

是FNC1,用于表示此ai条形码插件是GS1-128

是数据中间的FNC1,表示当前的可变长度的AI即30,的数据到此結束,后面的是其他AI的数据了如果不加这个FNC1,那么由于AI是30所对应的数据长度最多是8那么后面的4位数据1711,就会被误判为30的数据了

当然,如果本身数据是这样的:

即30这个可变长度的AI是最后一个AI,所以当然不怕再有后面的数据被误以为是30的数据当然可以省去最后的那个FNC1。

而作为解码器解码后对于除了第一个FNC1,在数据中间出现的其他的FNC1都应该替代为ASCII中GS字符=0x1D=29。而第一个FNC1按理来说,只是GS1-128条码的标示性的內容不属于ai条形码插件中的数据,所以不应该传输出来

即,解码后应该传输出来的数据是:

参考资料

 

随机推荐