GS1-128条形码和相关的AI及FNC1的详解

版本：v1.1

Crifan Li

摘要

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

[提 本文提供多种格式供：
示]      在线阅读      HTML HTMLs PDF CHM TXT RTF WEBHELP
    下载（7zip压缩包） HTML HTMLs PDF CHM TXT RTF WEBHELP

    HTML版本的在线地址为：

    http://www.crifan.com/files/doc/docbook/symbology_gs1128/release/html/
    symbology_gs1128.html

    有任何意见，建议，提交bug等，都欢迎去讨论组发帖讨论：

    http://www.crifan.com/bbs/categories/symbology_gs1128/

2012-08-09

┌─────────────────────────────────────────────────────────────────────────────┐
│修订历史                                                                     │
├────────────────────────────┬────────────────────────────────────┬───────────┤
│修订 1.0                    │2011-07-22                          │crl        │
├────────────────────────────┴────────────────────────────────────┴───────────┤
│ 1. 解释了GS1-128                                                            │
│ 2. 详解了AI的含义                                                           │
│ 3. 详解了FNC1的含义                                                         │
├────────────────────────────┬────────────────────────────────────┬───────────┤
│修订 1.1                    │2012-08-09                          │crl        │
├────────────────────────────┴────────────────────────────────────┴───────────┤
│ 1. 通过Docbook发布                                                          │
└─────────────────────────────────────────────────────────────────────────────┘

版权 © 2012 Crifan, http://crifan.com

本文章遵从：署名-非商业性使用 2.5 中国大陆(CC BY-NC 2.5)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

目录

缩略词
1. 什么是GS1
2. 为何叫GS1-128
3. 为何叫GS1-128

    3.1. GS1-128条码的格式
    3.2. GS1-128和Code 128之间的联系与区别

4. AI的解释
5. FNC1的详细解释

    5.1. FNC1是什么
    5.2. 第一个FNC1不应该传输出来
    5.3. 具体实现也可以用某个ASCII字符来表示第一个FNC1
    5.4. FNC1被当做为GS的时候，应该传输出来
    5.5. FNC1的总结
    5.6. 举例说明FNC1

参考书目

插图清单

3.1. GS1-128格式-文字版
3.2. GS1-128条形码符号集的结构
4.1. GS1-128 AI表 – 1/5
4.2. GS1-128 AI表 – 2/5
4.3. GS1-128 AI表 – 3/5
4.4. GS1-128 AI表 – 4/5
4.5. GS1-128 AI表 – 5/5
5.1. GS1-128条形码符号集结构文字版 -FNC1
5.2. GS1-128条码：(10)123456(30)1000(17)111230

表格清单

3.1. GS1-128格式-表格版

缩略词

AIM (AIM)

    Automatic Identification Manufacturers, Inc.

    自动识别制造商

AI (AI)

    Application Identifier

    应用标识符

GDSN (GDSN)

    Global Data Synchronization Network

    全球数据同步网络

第 1 章 什么是GS1

摘要

【todo】有空需要将Serialisation-GS1Dec2007.pdf中的内容整合进来

GS1，之前叫做EAN International，EAN国际（组织），2005年改叫GS1。

GS1是一个非盈利组织。

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

GS1 System主要包括四部分：

 1. Barcode

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

 2. eCom

    Electronic Communication，电子商务，实现电子商务信息交互

 3. GDSN

    Global Data Synchronization Network，全球数据同步网络，实现商业伙伴间的数据
    同步

 4. EPCglobal

    用RFID技术来实现产品追踪

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

GS1定义的这些规范，其实是和ISO和IEC相关的，对应关系就是：

 1. GS1的metadata registries对应的规范就是ISO/IEC 11179
 2. GS1的data identifiers对应的规范就是ISO/IEC 15418
 3. GS1的RFID air interfaces对应的规范是ISO/IEC 18000-6C

第 2 章 为何叫GS1-128

摘要

首先是因为GS1-128是Code 128符号集的子集。

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

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

第 3 章 为何叫GS1-128

目录

3.1. GS1-128条码的格式
3.2. GS1-128和Code 128之间的联系与区别

摘要

GS1-128，之前叫做UCC/EAN-128，其他叫法还有EAN-128, UCC-128, USS-128, GS1 128,
UCC.EAN-128, GTIN-128, UCC-12, EAN/UCC-13, EAN/UCC-14。

GS1-128是Code 128符号集的子集。

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

3.1. GS1-128条码的格式

GS1-128条码的格式，规范中的解释为：

图 3.1. GS1-128格式-文字版

GS1-128格式-文字版


用表格表示为：

表 3.1. GS1-128格式-表格版

Leading  Start pattern（The double    Data （    A Symbol   The Stop  Trailing
 Quiet          character）          including     Check    Character   Quiet
  Zone                                the AI)    Character              Zone
         A Start       The Function    AI
         Character (A, Code 1       AI related                         
         B, or C)      (FNC1)          Data
起始处的 起始位/起始字 FNC1字符     AI AI数据   校验码字符  停止位    末尾处的
静区     符                                                           静区


另外一种，去掉了Leading Quiet Zone和Trailing Quiet Zone，然后再用图形表示
GS1-128 Bar Code Symbol Structure如下：

http://www.gs1tw.org/twct/gs1w/download/GS_Section_5-3_V7.pdf

图 3.2. GS1-128条形码符号集的结构

GS1-128条形码符号集的结构


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

关于其中的Double character：

对应地，一般的所以Start Pattern，都只有一个字符，即Start Character，而此处由于
Start Character后面多了个FNC1字符，所以才成为Double character。

3.2. GS1-128和Code 128之间的联系与区别

  • 联系
     1. 简单的说，GS1-128就是Code 128的一种特殊形式。
     2. 特殊在于，GS1-128在普通Code 128的起始位后多了个FNC1，表示此条码为
        GS1-128条码，然后对于普通Code 128中的条码所表示的是普通数据，而GS1-128
        中的条码所表示的是AI加上对应的数据。
  • 区别
     1. Code 128有FNC1，FNC2，FNC3，FNC4共四个Function Code，而GS1-128中只有
        FNC1，没有FNC2，FNC3，FNC4。

第 4 章 AI的解释

摘要

AI是Application Identifier，应用标识符，的缩写。

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

内部是Code 128的符号集，就是对应的GS1-128，而这些符号集，叫做Data Carrier。此处
要解释的是，其中像Code 128，DataBar Expanded等符号集，允许在商品条目数据之前添
加一些描述性的信息。而AI，应用标识符，就是其具体表现形式。即在你条码数据之前，
加上一些标识，来对你的商品条目进行额外描述，比如说明某商品多重，有多少个，保质
期是多少等等，诸如此类的信息。

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

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

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

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

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

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

图 4.1. GS1-128 AI表 – 1/5

GS1-128 AI表 – 1/5


图 4.2. GS1-128 AI表 – 2/5

GS1-128 AI表 – 2/5


图 4.3. GS1-128 AI表 – 3/5

GS1-128 AI表 – 3/5


图 4.4. GS1-128 AI表 – 4/5

GS1-128 AI表 – 4/5


图 4.5. GS1-128 AI表 – 5/5

GS1-128 AI表 – 5/5


[注 注意
意]  1. **

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

     2. ***

        上面那些310-369，390-393的第四位的数字，表示小数点的位数

     3. FNC1

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

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

第 5 章 FNC1的详细解释

目录

5.1. FNC1是什么
5.2. 第一个FNC1不应该传输出来
5.3. 具体实现也可以用某个ASCII字符来表示第一个FNC1
5.4. FNC1被当做为GS的时候，应该传输出来
5.5. FNC1的总结
5.6. 举例说明FNC1

摘要

5.1. FNC1是什么

FNC1，全称是Function 1 Symbol Character，是GS1-128或者GS1-DataMartrix条形码编码
中的第一个符号字符。

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

http://www.tek-tips.com/viewthread.cfm?qid=87224

但是后来才发现自己上述理解，是错的。

正确的解释是：

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

FNC1不是ASCII字符集中（可见或非可见）的字符。

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

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

5.2. 第一个FNC1不应该传输出来

http://www.gs1tw.org/twct/gs1w/download/GS_Section_5-3_V7.pdf

图 5.1. GS1-128条形码符号集结构文字版 -FNC1

GS1-128条形码符号集结构文字版 -FNC1


其中，从GS1-128字符集的组成中，我们就可以看出，本身FNC1是属于double character
Start Patten中其中一个，和后面的Data数据，即我们真正的条形码中的数据，不是一起
的，所以也不应该传出来，而只应该传出来对应的后面的Data。

而上述的FNC1，由于处在条形码的最开始位置，所以也被称为第一个FNC1，或者Start
Position的FNC1。

5.3. 具体实现也可以用某个ASCII字符来表示第一个FNC1

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

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

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

http://www.gs1.org/docs/barcodes/
GS1_DataMatrix_Introduction_and_technical_overview.pdf

“FNC1 is a special, non-printable, character. It is often inserted using a
double-byte “Latch to extended ASCII” but this is system dependent”

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

  • Metrologic

    FNC1 = 129 = 0x81

  • http://www.experts123.com/q/
    how-do-i-set-the-fnc1-character-that-is-required-for-some-application-identifiers-in-ean-ucc-128.html

    FNC1 = ASCII 242 = 0xF2

  • http://www.gs1.org/docs/barcodes/
    GS1_DataMatrix_Introduction_and_technical_overview.pdf

    FNC1 = ASCII 232 = 0xE8

  • http://www.ciax.com/manuals/ref/ue128.htm

    FNC1 =%N（N是一个数字，比如1）

  • http://www.neodynamic.com/barcodes/UCC_EAN_128_Barcode.aspx

    FNC1 = ASCII 200 = 0xC8

5.4. FNC1被当做为GS的时候，应该传输出来

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

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

此时FNC1起的作用就是区分可变长度的AI和其他AI，用ASCII的GS（Group Separator，组
分隔符）字符=0x1D=29来表示。

（其中，也有对此处的FNC1起的作用，叫做域分隔符（Field Separator）的。）

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

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

5.5. FNC1的总结

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

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

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

 1. 放在最开始

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

 2. 放在后面某个位置

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

5.6. 举例说明FNC1

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

比如一个GS1-128的条形码，内容是：

(10)123456(30)1000(17)111230

然后对应的条码是：

图 5.2. GS1-128条码：(10)123456(30)1000(17)111230

GS1-128条码：(10)123456(30)1000(17)111230


先来说明，按照GS1-128的格式的话，对应的内容从左到右，依次是：

 1. 起始处的空白区域
 2. 起始位/起始字符
 3. （第一个）FNC1
 4. (10)123456(30)1000
 5. （数据中间的）FNC1
 6. (17)111230
 7. 校验码字符
 8. 停止位
 9. 末尾处的空白区域

其中：

3是FNC1，用于表示此条形码是GS1-128。

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

当然，如果本身数据是这样的：

(10)123456 (17)111230(30)1000

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

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

即，解码后，应该传输出来的数据是：

10123456301000[GS]17111230

其中[GS]代表ASCII中的GS字符。

[提 ASCII控制字符
示] GS是ASCII的控制字符中的其中一个。关于ASCII控制字符的详细解释，可参考：ASCII
    字符集中的功能/控制字符 Function/Control Code/Character in ASCII

参考书目

[1] GS1-128

[2] GS1 Application Identifiers (AIs)

[3] ISO/IEC 15417, Information Technology - Automatic Identification and Data
Capture Techniques - Bar code Symbology Specification - Code 128, Code 128条码
的规范

[4] GS1-128条码的规范是：Section 5.3: GS1-128 Symbology Specifications

[5] Free Online GS1-128 / EAN-128 Barcodes Generator

