GS1-128条形码和相关的AI及FNC1的详解
版本：v1.1
Crifan Li
摘要
此文主要解释了什么是GS1-128，为何叫做GS1-128，以及详细解析了AI和FNC1
本文提供多种格式供：

HTML版本的在线地址为：
http://​www.crifan.com/​files/​doc/​docbook/​symbology_​gs1128/​release/​html/​symbology_​gs1128.html
有任何意见，建议，提交bug等，都欢迎去讨论组发帖讨论：
http://​www.crifan.com/​bbs/​categories/​symbology_​gs1128/
在线阅读	HTML  1	HTMLs  2	PDF  3	CHM  4	TXT  5	RTF  6	WEBHELP  7	
下载（7zip压缩包）	HTML  8	HTMLs  9	PDF  10	CHM  11	TXT  12	RTF  13	WEBHELP  14	
修订历史	
修订 1.0	2011-07-22	crl	
· 	解释了GS1-128
· 	详解了AI的含义
· 	详解了FNC1的含义
· 		
修订 1.1	2012-08-09	crl	
· 	通过Docbook发布
· 		
GS1-128条形码和相关的AI及FNC1的详解:
Crifan Li
版本：v1.1
出版日期 2012-08-09
版权 © 2012 Crifan, http://​crifan.com

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

目录
缩略词  	 # 
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格式-表格版  	 # 

缩略词
Automatic Identification Manufacturers, Inc.
自动识别制造商
Application Identifier
应用标识符
Global Data Synchronization Network
全球数据同步网络

第 1 章 什么是GS1
【todo】有空需要将Serialisation-GS1Dec2007.pdf中的内容整合进来
GS1，之前叫做EAN International，EAN国际（组织），2005年改叫GS1。
GS1是一个非盈利组织。
GS1组织的目的就是去设计和实现一些标准，以提高供应与需求链的可视化以效率， 目前已经开发了一个系统，叫做GS1 System，是一系列标准的总称。
GS1 System主要包括四部分：
· 	Barcode
· 	条码，用于商品的自动识别系统
· 	eCom
· 	Electronic Communication，电子商务，实现电子商务信息交互
· 	GDSN
· 	Global Data Synchronization Network，全球数据同步网络，实现商业伙伴间的数据同步
· 	EPCglobal
· 	用RFID技术来实现产品追踪
· 	GS1负责维护一堆数据标识符（data identifier），即前缀码（code prefixe），用于其成员将它们分配给对应的成员公司，使这些公司可以去创建与GS1标准相兼容的识别键值（identification key）。
GS1定义的这些规范，其实是和ISO和IEC相关的，对应关系就是：
· 	GS1的metadata registries对应的规范就是ISO/IEC 11179
· 	GS1的data identifiers对应的规范就是ISO/IEC 15418
· 	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
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格式-文字版

用表格表示为：

表 3.1. GS1-128格式-表格版
Leading Quiet Zone	Start pattern（The double character）	Data （including the AI)	A Symbol Check Character	The Stop Character	Trailing Quiet Zone	
 	A Start Character (A, B, or C)	The Function Code 1 (FNC1)	AI	AI related 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条形码符号集的结构

如果了解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之间的联系与区别
联系简单的说，GS1-128就是Code 128的一种特殊形式。
· 	特殊在于，GS1-128在普通Code 128的起始位后多了个FNC1，表示此条码为GS1-128条码，然后对于普通Code 128中的条码所表示的是普通数据，而GS1-128中的条码所表示的是AI加上对应的数据。
· 	区别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

图 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

注意
**
· 	上述中的YYMMDD，即年份月份日期，如果只要求YYMM，即年份和月份，没有要求日子的话，那么DD就自动填充为00
· 	***
· 	上面那些310-369，390-393的第四位的数字，表示小数点的位数
· 	FNC1
· 	FNC1是在数据中间的话，是用于区分可变长度的AI，比如如果你是30后面最多可以有8位数字来表示产品数量，但是你只有4个数字，比如1000，那么此时就要跟一个FNC1字符，告诉解码程序，此变长的AI到此结束，后面的是其他AI的内容了
· 	上述部分AI的描述中的FNC1，好像不太正确，比如8100，因为本身是固定长度，不需要FNC1去区分
· 	

第 5 章 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是属于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字符集中的作用呢，主要就是两个：
· 	放在最开始
· 	即放在Start字符后的，处于符号集中的第二个位置，在数据之前。此处的作用是，标识此符号集是GS1-128字符集（之前被称为UCC/EAN-128）
· 	放在后面某个位置
· 	即数据中间有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的格式的话，对应的内容从左到右，依次是：
· 	起始处的空白区域
· 	起始位/起始字符
· 	（第一个）FNC1
· 	(10)123456(30)1000
· 	（数据中间的）FNC1
· 	(17)111230
· 	校验码字符
· 	停止位
· 	末尾处的空白区域
· 	其中：
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 ASCII1

参考书目
[1] GS1-1281 
[2] GS1 Application Identifiers (AIs)2 
[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 Specifications3 
[5] Free Online GS1-128 / EAN-128 Barcodes Generator4