Code128

条形码

条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。条形码可以标出物品的生产国、制造厂家、商品名称、生产日期、图书分类号、邮件起止地点、类别、日期等许多信息,因而在商品流通、图书管理、邮政管理、银行系统等许多领域都得到广泛的应用。

一维条形码:只是在一个方向(一般是水平方向)表达信息,而在垂直方向则不表达任何信息。常用码制包括EAN码、39码、交叉25码、UPC码、128码、93码,ISBN码及Codabar(库德巴码)等。

 EAN码

EAN码是国际物品编码协会制定的一种商品用条码,通用于全世界。EAN码符号有标准版(EAN-13)和缩短版(EAN-8)两种。标准版表示13位数字,又称为EAN13码,缩短版表示8位数字,又称EAN8。两种条码的最后一位为校验位,由前面的12位或7位数字计算得出。

它包括条码符号的图形部分和供人识读部分。图形部分包含起始符、左侧数据符、中间分隔符、右侧数据符、校验符、终止符以及左侧空白区和右侧空白区。图形部分的条和空按照一定的规则排列而成。整个条码符号通常由专门的条码符号生成软件生成。

国内推行使用的是EAN商品条形码,可分为EAN-13(标准版)和EAN-8(缩短版)两种。

 

Code128
 
条形码其实是分成很多类的,虽然他们看起来都差不多……
常见的条形码的码制被称为39码、128码、417码等等。我今天主要讲的是128码即CODE128。
 
Code128码其实还分成三类,即128A、128B、128C。它们的区别就是对应的字符表不一样。
 
那么Code128码到底怎么读呢?
从左往右是黑白相间的条形码,黑的叫“条”(B),白的叫“空”(S)。
如果你仔细看,条和空都有4种不同的宽度。我们将它从细到粗赋予1、2、3、4这几个值。
然后我们开始按照粗细的值来阅读条码、结果如下:
211232231131221213131222212222221224121213121211321132331112
注意这个结果是黑白相间的。别只顾着读“条”忘了都空。这边总共有61位。
Code128码有一个头一个尾。
尾总是2331112,这代表Code128已经结束。其余的部分是6位为一个块,包括头。
头有3种:A)211412 B)211214 C)211232 。这分别表示此Code128是什么类型的。(ABC其中一种)
我们将我们读出来的码,去掉头和尾,重新分一次块:
231131 | 221213 | 131222 | 212222 | 221224 | 121213 | 121211 | 32113
正好是6位为一块。其中最后一个块(除去尾段)是校验位,用于检查该条形码是否被正确编码。
然后,我们有一个字符表。(应该说是我有这张表)这张字符对应各个编号是表示的什么。
我们这个是Code128C型。C型码是纯数字的,每个块对应2位数字。
查表可得 50 09 05 00 01 91 91 。
 
有了这些知识,我们就可以尝试去写一个程序去生成条形码和识别条形码。
其实生成是比较简单的,而识别就比较麻烦了。通常超市是使用条码枪,通过光学原理来识别的,因为黑白条纹的反光特性不一样。
要是用软件对图像进行识别,会有些麻烦。但是,这正是我们要做的。
 
附:
Code128 字符表:
可以看出从0-63这前64个字符中A类和B类是一样的。
其中有些控制字符,比如CodeA表示此字段下一个个块临时使用Code128A的字符表中的字符。
还有一些其他的,不是很常见,有兴趣的朋友可以参考GBT 15425-2002 EAN UCC系统 128条码 标准。
 
 注:ABC分别为128A类,128B类,128C类的字符表。有些B类的字符为空表示和A类的一样。
B,S,B,S,B,S// A    B    C 
2,1,2,2,2,2,// sp          00
2,2,2,1,2,2,// !           01
2,2,2,2,2,1,// "           02
1,2,1,2,2,3,// #           03
1,2,1,3,2,2,// $           04
1,3,1,2,2,2,// %           05
1,2,2,2,1,3,// &           06
1,2,2,3,1,2,// ...         07
1,3,2,2,1,2,// (           08
2,2,1,2,1,3,// )           09
2,2,1,3,1,2,// *           10
2,3,1,2,1,2,// +           11
1,1,2,2,3,2,// ,           12
1,2,2,1,3,2,// -           13
1,2,2,2,3,1,// .           14
1,1,3,2,2,2,// /           15
1,2,3,1,2,2,// 0           16
1,2,3,2,2,1,// 1           17
2,2,3,2,1,1,// 2           18
2,2,1,1,3,2,// 3           19
2,2,1,2,3,1,// 4           20
2,1,3,2,1,2,// 5           21
2,2,3,1,1,2,// 6           22
3,1,2,1,3,1,// 7           23
3,1,1,2,2,2,// 8           24
3,2,1,1,2,2,// 9           25
3,2,1,2,2,1,// :           26
3,1,2,2,1,2,// ;           27
3,2,2,1,1,2,// <           28
3,2,2,2,1,1,// =           29
2,1,2,1,2,3,// >           30
2,1,2,3,2,1,// ?           31
2,3,2,1,2,1,// @           32
1,1,1,3,2,3,// A           33
1,3,1,1,2,3,// B           34
1,3,1,3,2,1,// C           35
1,1,2,3,1,3,// D           36
1,3,2,1,1,3,// E           37
1,3,2,3,1,1,// F           38
2,1,1,3,1,3,// G           39
2,3,1,1,1,3,// H           40
2,3,1,3,1,1,// I           41
1,1,2,1,3,3,// J           42
1,1,2,3,3,1,// K           43
1,3,2,1,3,1,// L           44
1,1,3,1,2,3,// M           45
1,1,3,3,2,1,// N           46
1,3,3,1,2,1,// O           47
3,1,3,1,2,1,// P           48
2,1,1,3,3,1,// Q           49
2,3,1,1,3,1,// R           50
2,1,3,1,1,3,// S           51
2,1,3,3,1,1,// T           52
2,1,3,1,3,1,// U           53
3,1,1,1,2,3,// V           54
3,1,1,3,2,1,// W           55
3,3,1,1,2,1,// X           56
3,1,2,1,1,3,// Y           57
3,1,2,3,1,1,// Z           58
3,3,2,1,1,1,// [           59
3,1,3,1,1,1,// \           60
2,2,1,4,1,1,// ]           61
4,3,1,1,1,1,// ^           62
1,1,1,2,2,4,// _           63
1,1,1,4,2,2,// NUL   '     64
1,2,1,1,2,4,// SOH   a     65
1,2,1,4,2,1,// STX   b     66
1,4,1,1,2,2,// ETX   c     67
1,4,1,2,2,1,// EOT   d     68
1,1,2,2,1,4,// ENQ   e     69
1,1,2,4,1,2,// ACK   f     70
1,2,2,1,1,4,// BEL   g     71
1,2,2,4,1,1,// BS    h     72
1,4,2,1,1,2,// HT    i     73
1,4,2,2,1,1,// LF    j     74
2,4,1,2,1,1,// VT    k     75
2,2,1,1,1,4,// FF    l     76
4,1,3,1,1,1,// CR    m     77
2,4,1,1,1,2,// SO    n     78
1,3,4,1,1,1,// SI    o     79
1,1,1,2,4,2,// DLE   p     80
1,2,1,1,4,2,// DC1   q     81
1,2,1,2,4,1,// DC2   r     82
1,1,4,2,1,2,// DC3   s     83
1,2,4,1,1,2,// DC4   t     84
1,2,4,2,1,1,// NAK   u     85
4,1,1,2,1,2,// SYN   v     86
4,2,1,1,1,2,// ETB   w     87
4,2,1,2,1,1,// CAN   x     88
2,1,2,1,3,1,// EM    y     89
2,1,4,1,2,1,// SUB   z     90
4,1,2,1,2,1,// ESC   {     91
1,1,1,1,4,3,// FS    |     92
1,1,1,3,4,1,// GS    }     93
1,3,1,1,4,1,// RS    ~     94
1,1,4,1,1,3,// US    DEL   95
1,1,4,3,1,1,// FNC3  FNC3  96
4,1,1,1,1,3,// FNC2  FNC2  97
4,1,1,3,1,1,// SHIFT SHIFT 98
1,1,3,1,4,1,// CodeC CodeC 99
1,1,4,1,3,1,// CodeB FNC4  CodeB
3,1,1,1,4,1,// FNC4  CodeA CodeA
4,1,1,1,3,1,// FNC1  FNC1  FNC1
2,1,1,4,1,2,//      StartA
2,1,1,2,1,4,//      StartB
2,1,1,2,3,2,//      StartC
2,3,3,1,1,1,2,//     Stop
 
 

 Code128码于1981年推出,是一种长度可变、连续性的字母数字条码。与其他一维条码比较起来,相对较为复杂,支持的字元也相对较多,又有不同的编码方式可供交互运用,因此其应用弹性也较大。

Code128特性:

1、具有A、B、C三种不同的编码类型,可提供标准ASCII中128个字元的编码使用;

2、允许双向扫描;

3、可自行决定是否加上检验位;

4、条码长度可调,但包括开始位和结束位在内,不可超过232个字元;

5、同一个128码,可以由A、B、C三种不同编码规则互换,既可扩大字元选择的范围,也可缩短编码的长度。

 

Code128各编码方式的编码范围:

1、Code128A:标准数字和字母,控制符,特殊字符;

2、Code128B:标准数字和字母,小写字母,特殊字符;

3、Code128C/EAN128:[00]-[99]的数字对集合,共100个,即只能表示偶数位长度的数字。

 

Code128编码规则:开始位 + [FNC1(为EAN128码时加)] + 数据位 + 检验位 + 结束位

 

Code128检验位计算:(开始位对应的ID值 + 每位数据在整个数据中的位置×每位数据对应的ID值)% 103

 

Code128编码表:

 

ID Code128A Code128B Code128C BandCode 编码值
0 SP  SP 0 212222 bbsbbssbbss
1 ! ! 1 222122 bbssbbsbbss
2 " " 2 222221 bbssbbssbbs
3 # # 3 121223 bssbssbbsss
4 $ $ 4 121322 bssbsssbbss
5 % % 5 131222 bsssbssbbss
6 & & 6 122213 bssbbssbsss
7 ' ' 7 122312 bssbbsssbss
8 ( ( 8 132212 bsssbbssbss
9 ) ) 9 221213 bbssbssbsss
10 * * 10 221312 bbssbsssbss
11 + + 11 231212 bbsssbssbss
12 , , 12 112232 bsbbssbbbss
13 - - 13 122132 bssbbsbbbss
14 . . 14 122231 bssbbssbbbs
15 / / 15 113222 bsbbbssbbss
16 0 0 16 123122 bssbbbsbbss
17 1 1 17 123221 bssbbbssbbs
18 2 2 18 223211 bbssbbbssbs
19 3 3 19 221132 bbssbsbbbss
20 4 4 20 221231 bbssbssbbbs
21 5 5 21 213212 bbsbbbssbss
22 6 6 22 223112 bbssbbbsbss
23 7 7 23 312131 bbbsbbsbbbs
24 8 8 24 311222 bbbsbssbbss
25 9 9 25 321122 bbbssbsbbss
26 : : 26 321221 bbbssbssbbs
27 ; ; 27 312212 bbbsbbssbss
28 < < 28 322112 bbbssbbsbss
29 = = 29 322211 bbbssbbssbs
30 > > 30 212123 bbsbbsbbsss
31 ? ? 31 212321 bbsbbsssbbs
32 @ @ 32 232121 bbsssbbsbbs
33 A A 33 111323 bsbsssbbsss
34 B B 34 131123 bsssbsbbsss
35 C C 35 131321 bsssbsssbbs
36 D D 36 112313 bsbbsssbsss
37 E E 37 132113 bsssbbsbsss
38 F F 38 132311 bsssbbsssbs
39 G G 39 211313 bbsbsssbsss
40 H H 40 231113 bbsssbsbsss
41 I I 41 231311 bbsssbsssbs
42 J J 42 112133 bsbbsbbbsss
43 K K 43 112331 bsbbsssbbbs
44 L L 44 132131 bsssbbsbbbs
45 M M 45 113123 bsbbbsbbsss
46 N N 46 113321 bsbbbsssbbs
47 O O 47 133121 bsssbbbsbbs
48 P P 48 313121 bbbsbbbsbbs
49 Q Q 49 211331 bbsbsssbbbs
50 R R 50 231131 bbsssbsbbbs
51 S S 51 213113 bbsbbbsbsss
52 T T 52 213311 bbsbbbsssbs
53 U U 53 213131 bbsbbbsbbbs
54 V V 54 311123 bbbsbsbbsss
55 W W 55 311321 bbbsbsssbbs
56 X X 56 331121 bbbsssbsbbs
57 Y Y 57 312113 bbbsbbsbsss
58 Z Z 58 312311 bbbsbbsssbs
59 [ [ 59 332111 bbbsssbbsbs
60 \ \ 60 314111 bbbsbbbbsbs
61 ] ] 61 221411 bbssbssssbs
62 ^ ^ 62 431111 bbbbsssbsbs
63 _ _ 63 111224 bsbssbbssss
64 NUL ` 64 111422 bsbssssbbss
65 SOH a 65 121124 bssbsbbssss
66 STX b 66 121421 bssbssssbbs
67 ETX c 67 141122 bssssbsbbss
68 EOT d 68 141221 bssssbssbbs
69 ENQ e 69 112214 bsbbssbssss
70 ACK f 70 112412 bsbbssssbss
71 BEL g 71 122114 bssbbsbssss
72 BS h 72 122411 bssbbssssbs
73 HT i 73 142112 bssssbbsbss
74 LF j 74 142211 bssssbbssbs
75 VT k 75 241211 bbssssbssbs
76 FF I 76 221114 bbssbsbssss
77 CR m 77 413111 bbbbsbbbsbs
78 SO n 78 241112 bbssssbsbss
79 SI o 79 134111 bsssbbbbsbs
80 DLE p 80 111242 bsbssbbbbss
81 DC1 q 81 121142 bssbsbbbbss
82 DC2 r 82 121241 bssbssbbbbs
83 DC3 s 83 114212 bsbbbbssbss
84 DC4 t 84 124112 bssbbbbsbss
85 NAK u 85 124211 bssbbbbssbs
86 SYN v 86 411212 bbbbsbssbss
87 ETB w 87 421112 bbbbssbsbss
88 CAN x 88 421211 bbbbssbssbs
89 EM y 89 212141 bbsbbsbbbbs
90 SUB z 90 214121 bbsbbbbsbbs
91 ESC { 91 412121 bbbbsbbsbbs
92 FS | 92 111143 bsbsbbbbsss
93 GS } 93 111341 bsbsssbbbbs
94 RS ~ 94 131141 bsssbsbbbbs
95 US DEL 95 114113 bsbbbbsbsss
96 FNC3 FNC3 96 114311 bsbbbbsssbs
97 FNC2 FNC2 97 411113 bbbbsbsbsss
98 SHIFT SHIFT 98 411311 bbbbsbsssbs
99 CODEC CODEC 99 113141 bsbbbsbbbbs
100 CODEB FNC4 CODEB 114131 bsbbbbsbbbs
101 FNC4 CODEA CODEA 311141 bbbsbsbbbbs
102 FNC1 FNC1 FNC1 411131 bbbbsbsbbbs
103 StartA StartA StartA 211412 bbsbssssbss
104 StartB StartB StartB 211214 bbsbssbssss
105 StartC StartC StartC 211232 bbsbssbbbss
106 Stop Stop Stop 2331112 bbsssbbbsbsbb




Code128编码示例
:以 95270078 为例

Code128A, 开始位对应的ID为103,第1位数据9对应的ID为25,第2位数据5对应的ID为21,依此类推,可以计算检验位 = (103 + 1*25 + 2*21 + 3*18 + 4*23 + 5*16 + 6*16 + 7*23 + 8*24) % 103 = 21,即检验位的ID为21。

对照编码表,95270078 编码表示为:开始位StartA(bbsbssssbss)+ 数据位[9(bbbssbsbbss)+  5(bbsbbbssbss)+ 2(bbssbbbssbs)+ 7(bbbsbbsbbbs)+  0(bssbbbsbbss)+ 0(bssbbbsbbss)+  7(bbbsbbsbbbs)+ 8(bbbsbssbbss)]+  检验位21(bbsbbbssbss)+  结束位Stop(bbsssbbbsbsbb), 即:bbsbssssbssbbbssbsbbssbbsbbbssbssbbssbbbssbsbbbsbbsbbbsbssbbbsbbssbssbbbsbbssbbbsbbsbbbsbbbsbssbbssbbsbbbssbssbbsssbbbsbsbb。 若要打印,只需将b用黑色线标出,s用白色线标出,一个简单的条形码生成程序就完成了!

128B 与128A类似,128C只能对长度为偶数的数字串编码,每两个数字为一位,所以输出的信息压缩了一半,打印的条形码因此也就较短。接上例,第1位数据 95对应ID为95,第2位数据27对应ID为27,第3位数据00对应ID为0,第4位数据78对应ID为78,所以检验位 = (105 + 1*95 + 2*27 + 3*0 + 4*78) % 103 = 51

EAN128与Code128C相同,只是在开始位后加多一个控制位FNC1(ID为102),同时将FNC1做为第1位数据加入到检验位的计算。

各种方式的编码结果罗列如下:

 

 编码方式  开始位  FNC1  数据位  检验位  结束位  编码结果
 Code128A  StartA  无  9 + 5 + 2 + 7 + 0 + 0 + 7 + 8  (103 + 1*25 + 2*21 + 3*18 + 4*23 + 5*16 + 6*16 + 7*23 + 8*24) % 103 = 21  Stop  bbsbssssbssbbbssbsbbssbbsbbbssbssbbssbbbssbsbbbsbbsbbbsbssbbbsbbssbssbbbsbbssbbbsbbsbbbsbbbsbssbbssbbsbbbssbssbbsssbbbsbsbb
 Code128B  StartB  无  9 + 5 + 2 + 7 + 0 + 0 + 7 + 8  (104 + 1*25 + 2*21 + 3*18 + 4*23 + 5*16 + 6*16 + 7*23 + 8*24) % 103 = 22  Stop  bbsbssbssssbbbssbsbbssbbsbbbssbssbbssbbbssbsbbbsbbsbbbsbssbbbsbbssbssbbbsbbssbbbsbbsbbbsbbbsbssbbssbbssbbbsbssbbsssbbbsbsbb
 Code128C  StartC  无  95 + 27 + 00 + 78  (105 + 1*95 + 2*27 + 3*0 + 4*78) % 103 = 51  Stop  bbsbssbbbssbsbbbbsbsssbbbsbbssbssbbsbbssbbssbbssssbsbssbbsbbbsbsssbbsssbbbsbsbb
 EAN128  StartC  FNC1  95 + 27 + 00 + 78  (105 + 1*102 + 2*95 + 3*27 + 4*0 + 5*78) % 103 = 44  Stop  bbsbssbbbssbbbbsbsbbbsbsbbbbsbsssbbbsbbssbssbbsbbssbbssbbssssbsbssbsssbbsbbbsbbsssbbbsbsbb

 

 

Code 128 條碼

Code 128 編碼方式是屬於比較複雜的一種條碼,應用起來比較有彈性,在1981年開始流行起來。

Code 128 條碼主要特性有:

1.有A,B,C三種不同的編碼型態,可以提供128個標準的ASCII code字元.

   包括: 0~9的數字,英文大小寫,各種特殊符號,以及控制碼。

2.有一檢查碼,可自由決定是否要列印。

3.在可藉由A、B、C三種不同編碼型態交叉使用,以縮短條碼的長度。

4.可允許由左至右,或由右至左,雙向掃瞄。


Code 128 條碼基本結構

圖一

Code 128 條碼內容主要有四個部份:

1.起始碼 (start code)

2.資料碼 (data code)

3.結束碼 (end code)

4.檢查碼 (check code):可有可無


Code 128 條碼字元編碼方式

Code 128 每一字元條碼結構由3條Bar及3條Space所組成.又細分為11等分,組成不同粗細比。字元最粗的線條最高可達最細的4倍。

例如:起始碼Code A

11010000100       條碼裡頭space最粗是最細線條的4倍

再舉個例子,我們以B型態中的特殊符號'/'說明

10111001100      最粗的bar是最細bar的3倍


起始碼與結束碼編碼方式

Code 128 條碼有A、B、C三種不同型態編碼的字元表,要選擇哪一種字元表取決於特殊控制碼Code A,Code B與Code C。

起始碼也有三種編碼型態:Code A,Code B,Code C

當起始碼為Code A時,後面的條碼資料則選擇A型態字元表編碼邏輯。

而起始碼為Code B時,後面的條碼資料則選擇B型態字元表編碼邏輯。

若全部為數字時可選擇Code C型態字元表編碼邏輯,以縮短條碼的列印長度。

每一類型的字元表內也有Code A,Code B,Code C,但條碼編碼邏輯與起始碼不同,請參閱【Code 128 條碼字元表】

接下來我們看三種起始碼的條碼編碼方式

Code A條碼資料為11010000100,條碼圖案為 ,相對值為103。

Code B條碼資料為11010010000,條碼圖案為 ,相對值為104。

Code C條碼資料為11010011100,條碼圖案為 ,相對值為105。

結束碼編碼方式

A,B,C三種不同型態編碼方式,結束碼均固定為1100011101011,條碼圖案為,相對值為106。


Code 128 條碼三種字元表型態編碼差異說明

1.A 型態字元表,支援的資料碼包含:標準ASCII=0 ~ ASCII=95等字元及控制碼部份,以及7個Code 128 條碼專屬字元,共計103個字元,請參閱code 128 條碼字元表中的A型態。(ASCII=0~31為控制碼,ASCII=32~95為可見字元。)

2.B型態字元表包含:標準ASCII=32 ~ ASCII=127等字元,以及7個Code 128 條碼專屬字元,共計103個字元,請參閱code 128 條碼字元表中的B型態。

3.C型態字元表主要支援數字00~99的編碼使用,若使用長數字的資料時,可以用C型態編碼,可縮短條碼列印的長度。數字00~99加上3個特殊控制字元,總共103個字元。

特殊控制字元說明

1.Code A:表示後面的字元編碼型態要使用A table。

2.Code B:表示後面的字元編碼型態要使用B table。

3.Code C:表示後面的字元編碼型態要使用C table。

4.Shift:等於Shift鍵的作用。

5.FNC 1:等於F1鍵的作用。

6.FNC 2:等於F2鍵的作用。

7.FNC 3:等於F3鍵的作用。

8.FNC 3:等於F4鍵的作用。


Code 128 條碼應用實例說明

1.Code C型態應用時機

我們舉以下例子,如果資料內如為數字0123456789,使用Code A及Code C條碼列印長度的差異,Code C條碼列印出來的長度較短。

Code A型態時的編碼如下圖

 

 

Code C型態時的編碼如下圖

 

 

2.Code A及Code C型態混合應用時機

 

前面4個字元ABCB使用A table編碼,所以起始碼以Code A開始,然後在數字0123456789之前加上Code C特殊控制碼,則後面的數字會轉換成C table編碼,如此就可以縮短條碼列印的長度。


Code 128 條碼檢查碼的計算方式

我們以起始碼Code B編碼的Andy’s條碼來說明

 

步驟一.計算出S值

S=103+(d1*1)+(d2*2)+ (d3*3)+ (d4*4)+ …

d1:表示資料第1個字元

因為起始碼為Code B,所以字元相對值使用B table。

則S=103+(33*1)+(78*2)+(68*3)+(89*4)+(7*5)+(83*6)=103+33+156+204+356+35+498=1385

步驟二.將S值除以103,取其餘數M值。

1385/103=13…46 ?取餘數M=46

步驟三.將M值46代入B table找到相對值的字元為N,即檢查碼為N。

提醒:

若資料碼裡有Code A,Code B,Code C型態轉換,檢查碼代入的依據均以起始碼相對應的字元組型態為主。

起始符(Unicode=00CC):ì
终止符(Unicode=00CE):Î
value95(Unicode=00C3):Ã
value96(Unicode=00C4):Ä
value97(Unicode=00C5):Å
value98(Unicode=00C6):Æ
value99(Unicode=00C7):Ç
value100(Unicode=00C8):è
value101(Unicode=00C9):é
value102(Unicode=00CA):ê 

posted @ 2017-07-12 21:59  巴蒂青葱  阅读(1018)  评论(0编辑  收藏  举报