一、條形碼概述
條形碼是由美國的N.T.Woodland在1949年首先提出的。近年來,隨著計算機應用的不斷普及,條形碼的應用得到了很大的發展。條形碼可以標出 商品的生產國、制造廠家、商品名稱、生產日期、圖書分類號、郵件起止地點、類別、日期等信息,因而在商品流通、圖書管理、郵電管理、銀行系統等許多領域都 得到了廣泛的應用。 條形碼是由寬度不同、反射率不同的條和空,按照一定的編碼規則(碼制)編制成的,用以表達一組數字或字母符號信息的圖 形標識符,即條形碼是一組粗細不同,按照一定的規則安排間距的平行線條圖形,常見的條形碼是由反射率相差很大的黑條(簡稱條)和白條(簡稱空)組成的。
二、條形碼識別系統的組成
為了閱讀出條形碼所代表的信息,需要一套條形碼識別系統,它由條形碼掃描器、放大整形電路、譯碼接口電路和計算機系統等部分組成。
三、條形碼的識別原理
由于不同顏色的物體,其反射的可見光的波長不同,白色物體能反射各種波長的可見光,黑色物體則吸收各種波長的可見光,所以當條形碼掃描器光源發出的光經 光闌及凸透鏡1后,照射到黑白相間的條形碼上時,反射光經凸透鏡2聚焦后,照射到光電轉換器上,于是光電轉換器接收到與白條和黑條相應的強弱不同的反射光 信號,并轉換成相應的電信號輸出到放大整形電路,白條、黑條的寬度不同,相應的電信號持續時間長短也不同。但是,由光電轉換器輸出的與條形碼的條和空相應 的電信號一般僅10mV左右,不能直接使用,因而先要將光電轉換器輸出的電信號送放大器放大,放大后的電信號仍然是一個模擬電信號,為了避免由條形碼中的 疵點和污點導致錯誤信號,在放大電路后需加一整形電路,把模擬信號轉換成數字電信號,以便計算機系統能準確判讀。
整形電路的脈沖數字信號 經譯碼器譯成數字、字符信息。它通過識別起始、終止字符來判別出條形碼符號的碼制及掃描方向;通過測量脈沖數字電信號0、1的數目來判別出條和空的數目. 通過測量0、1信號持續的時間來判別條和空的寬度,這樣便得到了被辯讀的條形碼符號的條和空的數目及相應的寬度和所用碼制,根據碼制所對應的編碼規則,便 可將條形符號換成相應的數字、字符信息,通過接口電路送給計算機系統進行數據處理與管理,便完成了條形碼辨讀的全過程。
以下是中華人民共和國國家標準 GB/T 12905-2000 中的術語:
- 1、條碼 bar code 由一組規則排列的條、空及其對應字符組成的標記,用以表示一定的信息。
- 2、條碼系統 bar code system 由條碼符號設計、制作及掃描識讀組成的系統。
- 3、反射率 reflectance;reflectivity 反射光強度與入射光強度的比值。
- 4、漫反射 deffuse reflection 投射在粗糙表面的光向各個方向反射的現象。
- 5、鏡反射 specular reflection 投射在光滑表面的光向各個方向反射的現象。
- 6、條 bar;dark bar;black bar 條碼中反射率較低的部分。
- 7、空 space;light bar 條碼中反射率較高的部分。
- 8、起始符 start character;start cipher;start code 位于條碼起始位置的若干條與空。
- 9、終止符 stop character;stop cipher;start code 位于條碼終止位置的若干條與空。
- 10、空白區 clear area;quiet zone;quiet area;clear zone 條碼起始符、終止符兩端外側與空的反射率相同的限定區域。
- 11、條碼符號 bar code symbol 包括空白區的條碼。
- 12、字符集 character seet 條碼符號可以表示的字母、數字和符號的集合。
- 13、中間分隔符 central seperating character 位于條碼中間位置用來分隔數據段的若干條與空。
- 14、分隔字符 separator 編碼字符集中的一種起分隔作用的特殊字符。
- 15、條碼字符 bar code character 表示一個字符或符號的若干條與空。
- 16、條碼字符集 bar code character set 某種條碼所能表示的條碼字符的集合。
- 17、條碼數據符 bar code data character 表示特定信息的條碼字符。
- 18、條碼校驗符 bar code check character 表示校驗碼的條碼字符。
- 19、條碼填充符 bar code filler character 不表示特定信息的條碼字符。
- 20、單元 element 構成條碼字符的條或空。
- 21、條高 bar height 垂直于單元寬度方向的條的高度尺寸。
- 22、條寬 bar width 條碼字符中條的的寬度尺寸。
- 23、空寬 space width 條碼字符的空的寬度尺寸。
- 24、條寬比 bar width ratio 條碼中最寬條與最窄條的寬度比。
- 25、空寬比 space width ratio 條碼中最寬空與最窄空的寬度比。
- 26、X尺寸 X dimension X 條碼符號中窄單元的標稱尺寸。
- 27、Z尺寸 Z dimension Z 條碼符號中窄單元的實際尺寸。
- 28、寬窄比 width to narrow ratio N 平均寬條的條寬與平均寬空的空寬之和(條碼字符間隔不計在內)除以兩倍Z尺寸。它是寬度調節編碼法中的技術參數。計算公式:N=(平均寬條的條寬+平均寬空的空寬)/2Z
- 29、條碼長度 bar code length 從條碼起始符前緣到終止符后緣的長度。
- 30、條碼符號的長度 bar code symbol length;symbol length 包括空白去的條碼長度。
- 31、縱橫比 aspect ratio 條碼長度與條高的比。
- 32、條碼密度 bar code density 單位長度條碼所表示的條碼字符的個數。注:通常用CPI表示,即每英寸內能表示的條碼字符的個數。
- 33、條碼字符間隔 inter-character gap 相鄰條碼字符間不表示特定信息且與空的反射率相同的區域。
- 34、模塊 module 模塊組配編碼法組成條碼字符的基本單位。
- 35、保護框 bearer bar 圍繞條碼且與條反射率相同的邊或框。
- 36、連續型條碼 continuos bar code 沒有條碼字符間隔的條碼。
- 37、非連續型條碼 discrete bar code 有條碼字符間隔的條碼。
- 38、雙向條碼 bi-directional bar code 條碼符號兩端均可作為掃描起點的條碼。
- 39、附加條碼 add-on 表示附加信息的條碼。
- 40、奇偶校驗 odd-even check 根據二進制數位中0或1的個數為奇數或偶數而進行校驗的方法。
- 41、自校驗條碼 self-checking bar code 條碼字符本身具有校驗功能的條碼。
- 42、定長條碼 fixed length of bar code 條碼字符個數固定的條碼。
- 43、非定長條碼 unfixed length of bar code 條碼字符個數不固定的條碼。
- 44、寬度調節編碼法 width encode 條碼符號中的條和空由寬、窄兩種單元組成的條碼編碼方法。
- 45、模塊組配編碼法 module combination encode 條碼符號的字符由規定的若干個模塊組成的條碼編碼方法。
- 46、二元碼 binary-edge-code 兩種單元寬度條碼,由兩種寬度單元組成的條碼字符。
- 47、多元碼 four-edge-code 多種單元寬度條碼,由三種或三種以上的寬度單元組成的條碼字符。
- 48、奇排列 odd permutation;odd parity 模塊組配編碼法中,一個條碼字符所含條的模塊數的和為奇數的排列。
- 49、偶排列 even permutation;even parity 模塊組配編碼法中,一個條碼字符所含條的模塊數的和為偶數的排列。
- 50、條碼邏輯式 bar code logic value 用二進制“0”和“1”表示條碼字符的表示式。
- 51、編碼容量 encoded volume 條碼字符集中所能表示的字符數的最大值。
- 52、條碼原版膠片 bar code film master 條碼膠片的母片。
- 53、一維條碼 linear bar code;one-dimentional bar code 只在一維方向上表示信息的條碼符號。
- 54、二維條碼 two-dimentional bar code 在二維方向上表示信息的條碼符號。
- 55、特種條碼 special bar code 特殊材料制成的條碼。
- 56、條碼字符的值 character value 一維條碼由條碼邏輯式向字符集轉換的中間值。
- 57、碼字 codeword 二維條碼字符的值。由條碼邏輯式象字符集轉換的中間值。
- 58、糾錯字符 error correction character 二維條碼中,錯誤檢測和錯誤糾正的字符。
- 59、糾錯碼字 error correction codeword 二維條碼中,糾錯字符的值。
四 條形碼的一些基本概念
◆碼制
條碼的碼制是指條碼符號的類型,每種類型的條碼符號都是由符合特定編碼規則的條和空組合而成。每種碼制都具有固定的編碼容量和所規定 的條碼字符集。條碼字符中字符總數不能大于該種碼制的編碼容量。常用的一維碼的碼制包括:EAN碼、39碼、交插25碼、UPC碼、128碼、93碼,及 Codabar(庫德巴碼)等。
◆條碼字符集
條碼字符集是指某種碼制所表示的全部字符的集合。有些碼制僅能表示10個數字字 符:0到9,如EAN/UPC碼,25條碼;有些碼制除了能表示10個數字字符外,還可以表示幾個特殊字符,如庫德巴條碼。39條碼可表示數字字 符:0~9,26個英文字母:A~Z以及一些特殊符號。
◆連續性與非連續性
條碼符號的連續性是指每個條碼字符之間不存在間 隔,相反,非連續性是指每個條碼字符之間存在間隔。從某種意義上講,由于連續性條碼不存在條碼字符間隔,即密度相對較高,而非連續性條碼的密度相對較 低。但非連續性條碼字符間隔引起誤差較大,一般規范不給出具體指標限制。而對連續性條碼除了控制尺寸誤差外,還需控制相鄰條與條,空與空的相同邊緣間的尺 寸誤差及每一條碼字符的尺寸誤差。
◆定長條碼與非定長條碼
定長條碼是指僅能表示固定字符個數的條碼。非定長條碼是指能表示可變字符個數的條碼。例如:EAN/UPC碼是定長條碼,它們的標準版僅能表示12個字符,39碼為非定長條碼。 定 長條碼由于限制了表示字符的個數,即密碼的無視率相對較低,因為就一個完整的條碼符號而言,任何信息的丟失總會導致密碼的失敗。非定長條碼具有靈活、方便 等優點,但受掃描器及印刷面積的控制,它不能表示任意多個字符,并且在掃描閱讀過程中可能產生因信息丟失而引起錯誤密碼,這些缺點在某些碼制(如交插25 碼)中出現的概率相對較大,這個缺點可通過識讀器或計算機系統的校驗程度而克服。
◆雙向可讀性
條碼符號的雙向可讀性,是指從左、 右兩側開始掃描都可被識別的特性。絕大多數碼制都可雙向識讀,所以都具有雙向可讀性。事實上,雙向可讀性不僅僅是條碼符號本身的特性,它是條碼符號和掃描 設備的綜合特性。對于雙向可讀的條碼,識讀過程中譯碼器需要判別掃描方向。有些類型的條碼符號,其掃描方向的判定是通過起始符與終止符來完成。例如39 碼、交插25碼、庫德巴碼。有些類型的條碼,由于從兩個方向掃描起始符和終止符所產生的數字脈沖信號完全相同,所以無法用它們來判別掃描方向。例 如:EAN和UPC碼。在這種情況下,掃描方向的判別則是通過條碼數據符的特定組合來完成的。對于某些非連續性條碼符號,例如:39條碼,由于其字符集 中存在著條碼字符的對稱性(例如字符“*”與“P”,“M”與“—”等),在條碼字符間隔較大時,很可能出現因信息丟失而引起的譯碼錯誤。
◆自校驗特性
條碼符號的自校驗特性是指條碼字符本身具有校驗特性。若在一條碼符號中,一個印刷缺陷(例如,因出現污點把一個窄條錯認為寬條,而相鄰寬空錯認為窄空)不會 導致替代錯誤,那么這種條碼就具有自校驗功能。例如39條碼、庫德巴條碼、交插25條碼都具有自校驗功能;EAN和UPC條碼、93條碼等都沒有自校驗功 能。自校驗功能也能校驗出一個印刷缺陷。對于大于一個的印刷缺陷,任何自校驗功能的條碼都不可能完全校驗出來。對于某種碼制,是否具有自校驗功能是由其編 碼結構決定的。碼制設置者在設置條碼符號時,均須考慮自校驗功能。
五 一維條碼控件
(圖1: 標準版商品條碼符號結構)
(圖2:標準版商品條碼符號構成示意圖)
★左側空白區:
位于條碼符號最左側的與空的反射率相同的區域,其最小寬度為11個模塊寬。
★起始符:
位于條碼符號左側空白區的右側,表示信息開始的特殊符號,由3個模塊組成。
★左側數據符:
位于起始符號右側,是平分字符的特殊符號,由5個模塊組成。
★中間分隔符:
位于左側數據符的右側,是平分條碼字符的特殊符號,由5個模塊組成。
★右側數據符:
位于中間分隔符右側,表示5位數字信息的一組條碼字符,由35個模塊組成。
★校驗符:
位于右側數據符的右側,表示校驗碼的條碼字符,由7個模塊組成。
★終止符:
位于條碼符號校驗符的右側,表示信息結束的特殊符號,由3個模塊組成。
★右側空白區:
位于條碼符號最右側的與空的反射率相同的區域,其最小寬度為7個模塊寬。為保護右側空白區的寬度,可在條碼符號右下角加 ">" 符號, "<" 符號的位置見圖3。
(圖3:標準版條碼符號右空白區中“>”的位置及尺寸)
★供人識別字符:
位于條碼符號的下方,與條碼相對應的13位數字。供人識別字符優先選用GB/T 12508中規定的OCR-B字符集;字符頂部和條碼字符底部的最小距離為0.5個模塊寬。EAN-13商品條碼供人識別字符中的前置碼印制在條碼符號起始符的左側
(1)EAN碼:
EAN碼是國際物品編碼協會制定的一種商品用條碼,通用于全世界。EAN碼符號有標準版(EAN-13)和縮短版(EAN-8)兩種,我國的通用商品條碼與其等效,日常購買的商品包裝上所印的條碼一般就是EAN碼。
(2)UPC碼:
UPC碼是美國統一代碼委員會制定的一種商品用條碼,主要用于美國和加拿大地區,我們在美國進口的商品上可以看到。如圖所示:
(3)39碼:
39碼是一種可表示數字、字母等信息的條碼,主要用于工業、圖書及票證的自動化管理,目前使用極為廣泛。
(4)Code 93碼:
Code 93碼與39碼具有相同的字符集,但它的密度要比39碼高,所以在面積不足的情況下,可以用93碼代替39碼。
(5)庫德巴碼:
庫德巴碼也可表示數字和字母信息,主要用于醫療衛生、圖書情報、物資等領域的自動識別。
(6)Code 128 碼:
128可表示ASCII 0 到 ASCII 127 共計128個ASCII字
(7)ITF 25 條碼:
交插25碼是一種條和空都表示信息的條碼,交插25碼有兩種單元寬度,每一個條 碼字符由五個單元組成,其中二個寬單元,三個窄單元。在一個交插25碼符號中,組成條碼符號的字符個數為偶數,當字符是奇數個時,應在左側補0變為偶數。 條碼字符從左到右,奇數位置字符用條表示,偶數位字符用空表示。交插25碼的字符集包括數字0到9。
(8)Industrial 25 條碼:
Industrial 25碼只能表示數字,有兩種單元寬度。每個條碼字符由五個條組成,其中兩個寬條,其余為窄條。這種條碼的空不表示信息,只用來分隔條,一般取與窄條相同的寬寬度。
(9)Matrix 25 條碼:
Matrix 25碼只能表示數字0到9。當采用Matrix25碼的編碼規范,而采用ITF25碼的啟始符和終止符時,生成的條碼就是中國郵政碼。我公司的LabelShop條碼標簽打印軟件可打印中國郵政碼!
六 、二維條碼
一維條碼所攜帶的信息量有限,如商品上的條碼僅能容納13位(EAN-13碼)阿拉伯數字,更多的信息只能依賴商品數據庫的支持,離開了預先建立的數據 庫,這種條碼就沒有意義了,因此在一定程度上也限制了條碼的應用范圍。基于這個原因,在90年代發明了二維條碼。二維條碼除了具有一維條碼的優點外,同時 還有信息量大、可靠性高,保密、防偽性強等優點。
目前二維條碼主要有PDF417碼、Code49碼、Code 16K碼、Data Matrix碼、MaxiCode碼等,主要分為堆積或層排式和棋盤或矩陣式兩大類。
二維條碼作為一種新的信息存儲和傳遞技術,從誕生之時就受到了國際社會的廣泛關注。經過幾年的努力,現已應用在國防、公共安全、交通運輸、醫療保健、工業、商業、金融、海關及政府管理等多個領域。
二維條碼依靠其龐大的信息攜帶量,能夠把過去使用一維條碼時存儲于后臺數據庫中的信息包含在條碼中,可以直接通過閱讀條碼得到相應的信息,并且二維條碼還有錯誤修正條碼技術及防偽功能,增加了數據的安全性。
二維條碼可把照片、指紋編制于其中,可有效地解決證件的可機讀和防偽問題。因此,可廣泛應用于護照、身份證、行車證、軍人證、健康證、保險卡等。
(1)PDF417 二維條碼控件
PDF417是一種堆疊式二維條碼,目前應用最為廣泛。PDF417條碼是由美國SYMBOL公司發明的,PDF(Portable Data File)意為"便攜數據文件"。組成條碼的每一個條碼字符由4個條和4個空,共17個模塊構成,故稱為PDF417條碼。
PDF417條碼可表示數字、字母或二進制數據,也可表示漢字。一個PDF417條碼最多可容納1850個字符或1108 個字節的二進制數據,如果只表示數字則可容納2710個數字。PDF417的糾錯能力分為9級,級別越高,糾正能力越強。由于這種糾錯功能,使得污損的 417條碼也可以正確讀出。我國目前已制定了PDF417碼的國家標準。 PDF417條碼需要有417解碼功能的條碼閱讀器才能識別。
PDF417條碼最大的優勢在于其龐大的數據容量和極強的糾錯能力。當PDF417條碼用于防偽時,并不是PDF417條碼不能被復制,而是由于使用PDF417條碼可以將大量的數據快速讀入計算機,使得大規模的防偽檢驗成為可能。
(2)QR Code 二維條碼
QR Code碼是由日本Denso公司于1994年9月研制的一種矩陣二維碼符號,它除具有一維條碼及其它二維條碼所具有的信息容量大、可靠性高、可表示漢字及圖象多種文字信息、保密防偽性強等優點。
七 商品條碼(EAN條碼)的編碼結構
包括標準版商品條碼(EAN—13條碼)和縮短版商品條碼(EAN—8條碼)。 1、標準版商品條碼:EAN—13 標準版商品條碼所表示的代碼由13位數字組成,其結構如下: 結構一:X13X12X11X10X9X8X7 X6X5X4X3X2 X1, 其中:X13 ??X7廠商識別代碼;X6 ??X2表示商品項目代碼;X1校驗碼。 結構二:X13X12X11X10X9X8X7 X6 X5X4X3X2 X1。其中:X13 ??X6廠商識別代碼;X5 ??X2表示商品項目代碼;X1校驗碼。當X13X12X11為690、691時,其代碼結構同結構一;當X13X12X11為692時,其代碼結構同結構二。 2、縮短版商品條碼:EAN-8 縮短版商品條碼由8位數字組成,其結構如下: X8X7 X6 X5X4X3X2 X1;其中:X8X7 X6:其含義同標準版商品條碼的X13X12X11;X5X4X3X2:表示商品項目代碼,由EAN編碼組織統一分配。在我國,由中國物品編碼中心統一分 配;X1:校驗碼。計算時,需在縮短版商品條碼代碼前加5個“0”,然后按標準版商品條碼校驗碼的計算方法計算。
八 EAN-13 商品條碼的符號結構
EAN-13商品條碼由左側空白區、起始符、左側數據符、中間分隔符、右側數據符、校驗符、終止符、右側空白區及供人識別字符組成。見圖1和圖2。
九 EAN碼校驗位的計算方法
下面的算法來自互聯網,不是最方便的,但可以使用 /** EAN碼校驗位的計算方法 從代碼位置序號2開始,所有偶數位的數字代碼求和為a。 將上步中的a乘以3為a。 從代碼位置序號3開始,所有奇數位的數字代碼求和為b。 將a和b相加為c。 取c的個位數d。 用10減去d即為校驗位數值。 例:234235654652的校驗碼的計算如下表: 數據碼 校驗碼 代碼位置序號 13 12 11 10 9 8 7 6 5 4 3 2 1 數字碼 2 3 4 2 3 5 5 5 4 6 5 2 ? 偶數位 3 + 2 + 5 + 5 + 6 + 2 奇數位 2 + 4 + 3 + 5 + 4 + 5 步驟1:3+2+5+5+6+2=23 步驟2:23*3=69 步驟3:2+4+3+5+4+5=23 步驟4:69+23=92 步驟5:10-2=8 步驟6:校驗碼為 8 數據碼 校驗碼 代碼位置序號 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 數字碼 2 0 0 0 0 0 5 0 0 2 2 0 0 0 1 4 7 ? 偶數位 2 + 0 + 0 + 5 + 0 + 2 + 0 + 1 + 7 奇數位 0 + 0 + 0 + 0 + 2 + 0 + 0 + 4 步驟1:2+0+0+5+0+2+0+1+7=17 步驟2:17*3=51 步驟3:0+0+0+0+2+0+0+4=6 步驟4:51+6=57 步驟5:10-7=3 步驟6:校驗碼為 3 */ /// <summary> /// EAN碼校驗位的計算 /// </summary> /// <param name="szCode"></param> /// <returns></returns> private bool GetVerifyBit(ref string szCode) { int nNum1 = 0; int nNum2 = 0; int nNum3 = 0; int szLen = 0; if ( szCode == null ) return false; szLen = szCode.Length; if(szLen <=12 || szLen >= 17) return true; for ( int i=0; i<szLen; i++) { if ( i%2 == 0 ) { nNum2 += int.Parse(szCode[i].ToString()); //偶數 } else { nNum1 += int.Parse(szCode[i].ToString()); //奇數 } } nNum3 = (Operator.DiscountLabelBarLength % 2 ==0) ? nNum1 + nNum2 * 3 : nNum1 * 3 + nNum2 ; int t ; if(nNum3%10>0) t= 10- (nNum3 % 10) ; else t=0; szCode+=t; return true } /// <summary> /// EAN碼校驗位的計算 /// </summary> /// <param name="szCode"></param> /// <returns></returns> private bool GetVerifyBit(ref string szCode) { int nNum1 = 0; int nNum2 = 0; int nNum3 = 0; int szLen = 0; if ( szCode == null ) return false; szLen = szCode.Length; if(szLen <=12 || szLen >= 17) return true; for ( int i=0; i<szLen; i++) { if ( i%2 == 0 ) { nNum2 += int.Parse(szCode[i].ToString()); //偶數 } else { nNum1 += int.Parse(szCode[i].ToString()); //奇數 } } nNum3 = (Operator.DiscountLabelBarLength % 2 ==0) ? nNum1 + nNum2 * 3 : nNum1 * 3 + nNum2 ; int t ; if(nNum3%10>0) t= 10- (nNum3 % 10) ; else t=0; szCode+=t; return true }