[轉載] 一維條碼

轉載自 青衫(邱奕南)

一維條碼可分為39碼、EAN-13碼、EAN-8碼、UPC-A碼、UPC-E碼、交錯式25碼、CODABAR碼(又稱NW-7碼)、128碼等多種,以下便說明一下各種條碼的意義,以及編碼方式:

(一)39碼

39碼發展於1974年,由於限制少,又支援文數字,因此多應用於一般管理軟體。其編碼特性如下:

1. 資料碼可以是0~9、A~Z、-、.、Space、$、/、+、%等43種,資料長度不限,各資料編號次序依上列次序編號0~42。
2. 編碼結構為〔起始碼+資料碼+檢查碼+終止碼〕,其中檢查碼可有可無,且檢查碼亦會被視為資料輸入。
3. 起始碼與終止碼均固定為*。
4. 檢查碼為資料編號值(0~42)累加後(Sum)除以43取餘數,並將該值視為相對應資料編號值的資料。
5. 編碼資料如下,每碼有9條,其中3條為粗,各佔12線。以下各位元奇數位為黑,要畫線,偶數位為白,不畫線,0為細,1為粗:

0 000110100
1 100100001
2 001100001
3 101100000
4 000110001
5 100110000
6 001110000
7 000100101
8 100100100
9 001100100
A 100001001
B 001001001
C 101001000
D 000011001
E 100011000
F 001011000
G 000001101
H 100001100
I 001001100
J 000011100
K 100000011
L 001000011
M 101000010
N 000010011
O 100010010
P 001010010
Q 000000111
R 100000110
S 001000110
T 000010110
U 110000001
V 011000001
W 111000000
X 010010001
Y 110010000
Z 011010000
- 010000101
. 110000100
Space 011000100
$ 010101000
/ 010100010
+ 010001010
% 000101010
* 010010100

各資料碼之間必須再空開一條白線。


(二)EAN-13碼

EAN-13碼(European Article Number,歐洲商品條碼)是1977年由歐洲十二個工業國家所共同發展出來的一種條碼系統,其後逐漸變成國際性的條碼系統,一般多用作商品標示條碼。其編碼特性如下:

1. 資料只能為0~9之數字計12個,連同檢查碼共13碼。資料中包括國家代碼3碼、廠商代碼4碼、產品代碼5碼,為一種專用於商品標示的條碼。
2. 編碼結構為〔護線+6個左資料碼+中線+5個右資料碼+檢查碼+護線〕,共佔119條線。其中在畫線時,護線和中線在下方均略長於資料碼,以便肉眼能明顯區分,但對於條碼機閱讀時並無差異。
3. 左資料的編碼方式有A、B兩組之分,而資料的第一碼隱藏在左資料碼的編碼方式,故實際只編出12碼。以下為左資料依首碼所對應使用的編碼方式:

0 AAAAAA
1 AABABB
2 AABBAB
3 AABBBA
4 ABAABB
5 ABBAAB
6 ABBBAA
7 ABABAB
8 ABABBA
9 ABBABA

4. 左資料的編碼方式,A組編碼為:

0 0001101
1 0011001
2 0010011
3 0111101
4 0100011
5 0110001
6 0101111
7 0111011
8 0110111
9 0001011

B組編碼為:

0 0100111
1 0110011
2 0011011
3 0100001
4 0011101
5 0111001
6 0000101
7 0010001
8 0001001
9 0010111

以上各位元0為白,1為黑。

5. 護線固定為101,中線固定為01010,各位元0為白,1為黑。
6. 右資料編碼方式固定為:

0 1110010
1 1100110
2 1101100
3 1000010
4 1011100
5 1001110
6 1010000
7 1000100
8 1001000
9 1110100

各位元0為白,1為黑。

7. 檢查碼計算方式為1000減去前12碼之奇數碼和與偶數碼和*3後,除以10取餘數。假設各碼依次為ABCDEFGHIJKLM,則M = (1000 - (A+C+E+G+I+K) - (B+D+F+H+J+L)*3) % 10。

(三)EAN-8碼

EAN-8碼為EAN-13碼的簡化型,除了少掉了廠商代碼外,其餘大致和EAN-13碼相同,其編碼特性如下:

1. 資料只能為0~9之數字計7個,連同檢查碼共8碼。資料中包括國家代碼3碼、產品代碼5碼。
2. 編碼結構為〔護線+4個左資料碼+中線+3個資料碼+檢查碼+護線〕,共佔67條線。其中在畫線時,護線和中線在下方均略長於資料碼,以便肉眼能明顯區分,但對於條碼機閱讀時並無差異。
3. 首碼不再隱藏於編碼方式,因此實際編出8碼。左資料一律以A組方式編碼,右資料編碼方式同EAN-13碼(請參閱EAN-13碼)。
4. 檢查碼為1000減去前7碼之奇數碼和*3與偶數碼和後,除以10取餘數。假設各碼依次為ABCDEFGH,則
H = (1000 - (A+C+E+G)*3 - (B+D+F)) % 10。



(四)UPC-A碼

UPC-A碼(Universal Product Code,統一商品條碼)為1973年由美國超級市場公會所發展出來的條碼系統,適用於加拿大以及北美等地區,亦為EAN碼的前身,因此和EAN碼極為相似。UPC-A碼共有13碼,除了最後一個檢查碼外,還包括了旗碼2碼、廠商代碼5碼、產品代碼5碼。其中旗碼第一碼固定為0,第二碼用以表示商品的種類。整個UPC-A的編碼結構和EAN-13碼是完全相同的,只是首碼必須固定為0,因此在編碼上較EAN-13碼簡單。

(五)UPC-E碼

UPC-E碼為UPC-A碼的簡化型,共計有8碼,係由某些特殊的UPC-A碼簡化而來。由於並非所有UPC-A碼均能簡化成UPC-E碼,因此可簡化的UPC-A碼有一定的限制,這些限制為:

1. 旗碼=00,廠商代碼=xx000,產品代碼=00xxx
2. 旗碼=00,廠商代碼=xx100,產品代碼=00xxx
3. 旗碼=00,廠商代碼=xx200,產品代碼=00xxx
4. 旗碼=00,廠商代碼=xxx00,產品代碼=000xx
5. 旗碼=00,廠商代碼=xxxx0,產品代碼=0000x
6. 旗碼=00,廠商代碼=xxxxx,產品代碼=00005~00009

假設UPC-A各碼依次為ABCDEFGHIJKLM,則符合上述這些限制的UPC-A碼,可依次簡化成下列對應的UPC-E碼:

1. 0CDJKL0M
2. 0CDJKL1M
3. 0CDJKL2M
4. 0CDEKL3M
5. 0CDEFL4M
6. 0CDEFGLM

以下則為UPC-E碼的編碼特性:

1. 資料只能為0~9之數字計7個,連同檢查碼共8碼。各資料代表意義如前所述。
2. 編碼方式為〔左護線+6個資料碼+右護線〕,共佔51條線。由於第一碼固定為0,不列入編碼,而檢查碼隱含在編碼方式中,因此實際只編出6碼。
3. 資料碼依檢查碼有A、B兩組不同的編碼方式,各檢查碼對應的資料編碼方式如下:

0 BBBAAA
1 BBABAA
2 BBAABA
3 BBAAAB
4 BABBAA
5 BAABBA
6 BAAABB
7 BABABA
8 BABAAB
9 BAABAB

A、B兩組編碼方式同EAN-13碼。

4. 檢查碼計算方式如下:

0ABCDEFM : M = (1000 - (A+D+F) - (B+C+E)*3) % 10,F = 0~2
0ABCDE3M : M = (1000 - (A+C+D) - (B+E)*3) % 10
0ABCDE4M : M = (1000 - (A+C) - (B+D+E)*3) % 10
0ABCDEFM : M = (1000 - (A+C+E) - (B+D+F)*3) % 10,F = 5~9

5. 左護線固定為101,右護線固定為010101,以上各位元0為白,1為黑。



(六)交錯式25碼

交錯式25碼(Interleaved 2 of 5)發展於1972年,為最早出現的條碼系統。由於編碼方式係採2個資料交錯放置,且每個資料有5條線,故命令為交錯式25碼。其編碼特性如下:

1. 資料只能為0~9之數字,長度不限,但必須是偶數個,不足時最前面必須多補一個0。
2. 編碼結構為〔起始碼+資料碼+終止碼〕。
3. 編碼資料如下,每碼有5條線,其中2條為粗,故每碼各佔7線,各位元值0為細,1為粗:

0 00110
1 10001
2 01001
3 11000
4 00101
5 10100
6 01100
7 00011
8 10010
9 01010

實際編碼時,以2個資料之位元交錯放置,也就是第一個資料放一個位元,然後輪第二個資料放一個位元,再輪回第一個資料放一位元,如此循環下去。編碼完畢後,在奇數位者一律為黑(要畫線),偶數位者一律為白(不畫線)。

4. 起始碼固定為0000,終止碼固定為100。依前述奇數位為黑、偶數位為白、0為細、1為粗,則起始碼為細黑、細白、細黑、細白,而終止碼為粗黑、細白、細黑。

除了交錯式25碼外,也有沒進行交錯排列處理的標準式25碼(Standard 2 of 5),但使用上沒有交錯式25碼普及。

(七)CODABAR碼(又稱NW-7碼)

CODABAR碼發展於1972年,但直到1977年才正式被使用。由於發展年份和交錯式25碼相近,因此編碼方式有許多地方頗相似。其編碼特性如下:

1. 資料只能為數字0~9,以及/+-*$.:等7個特殊符號,長度最長為32碼資料。
2. 編碼結構為〔起始碼+資料碼+終止碼〕,其中起始碼和終止碼必須為英文字母A~D。
3. 編碼資料如下,每碼有7條線,長度不一,各位元奇數位為黑,偶數位為白,0為細,1為粗:

0 0000011
1 0000110
2 0001001
3 1100000
4 0010010
5 1000010
6 0100001
7 0100100
8 0110000
9 1001000
$ 0011000
- 0001100
A 0011010
B 0101001
C 0001011
D 0001110
+ 0010101
. 1010100
: 1000101
/ 1010001
* 1010101

各資料碼之間必須再空開一條白線。



(八)128碼

128碼是個功能強大卻頗複雜的條碼系統,約於1981年開始被採用。其編碼特性如下:

1. 資料可為ASCII 0~127之任何字元,長度最長30個資料。
2. 編碼結構為〔起始碼+資料碼+終止碼+檢查碼〕,其中檢查碼可有可無,通常不加。
3. 有三類編碼方式:

A類:ASCII 0~95。
B類:ASCII 32~127。
C類:數字00~99。

其中ASCII 0~31對應編碼索引為64~95,ASCII 32~95對應編碼索引為0~63,ASCII 96~127對應編碼索引為64~95,C類數字直接對應至編碼索引。各類尚有特殊編碼索引值如下:

A類:F3=96、F2=97、Shift=98、Code C=99、Code B=100、F4=101、F1=102
B類:F3=96、F2=97、Shift=98、Code C=99、F4=100、Code A=101、F1=102
C類:Code B=100、Code A=101、F1=102

4. 起始碼有11線,用以決定一開始的編碼類型,各類型的起始碼為:

A類 = 11010000100
B類 = 11010010000
C類 = 11010011100

終止碼有13線,固定為1100011101011。

5. 各編碼索引對應之編碼值如下,0表白線,1表黑線,各佔11條線:

00 11011001100
01 11001101100
02 11001100110
03 10010011000
04 10010001100
05 10001001100
06 10011001000
07 10011000100
08 10001100100
09 11001001000
10 11001000100
11 11000100100
12 10110011100
13 10011011100
14 10011001110
15 10111001100
16 10011101100
17 10011100110
18 11001110010
19 11001011100
20 11001001110
21 11011100100
22 11001110100
23 11101101110
24 11101001100
25 11100101100
26 11100100110
27 11101100100
28 11100110100
29 11100110010
30 11011011000
31 11011000110
32 11000110110
33 10100011000
34 10001011000
35 10001000110
36 10110001000
37 10001101000
38 10001100010
39 11010001000
40 11000101000
41 11000100010
42 10110111000
43 10110001110
44 10001101110
45 10111011000
46 10111000110
47 10001110110
48 11101110110
49 11010001110
50 11000101110
51 11011101000
52 11011100010
53 11011101110
54 11101011000
55 11101000110
56 11100010110
57 11101101000
58 11101100010
59 11100011010
60 11101111010
61 11001000010
62 11110001010
63 10100110000
64 10100001100
65 10010110000
66 10010000110
67 10000101100
68 10000100110
69 10110010000
70 10110000100
71 10011010000
72 10011000010
73 10000110100
74 10000110010
75 11000010010
76 11001010000
77 11110111010
78 11000010100
79 10001111010
80 10100111100
81 10010111100
82 10010011110
83 10111100100
84 10011110100
85 10011110010
86 11110100100
87 11110010100
88 11110010010
89 11011011110
90 11011110110
91 11110110110
92 10101111000
93 10100011110
94 10001011110
95 10111101000
96 10111100010
97 11110101000
98 11110100010
99 10111011110
100 10111011110
101 11101011110
102 11110101110



6. 檢查碼的計算方式103加上各資料的編碼索引值乘上位置值的總和,再除以103取餘數。假設資料編碼索引值依次為ABC,則檢查碼 = (103 + A*1 + B*2 + C*3) % 103。計算出檢查碼後,即視為編碼索引值進行編碼。
7. 特殊資料碼意義為:

F1~F4 = 同按下F1~F4鍵
Shift = 同按下Shift鍵
Code A = 編碼類別改成A類
Code B = 編碼類別改成B類
Code C = 編碼類別改成C類

由於128碼可以中途轉變編碼類別,因此同一個資料可能有多個編碼方式,如何將編碼長度縮到最小,便成為一項考驗。以下係我們經過分析後,所得到的演算法,可使得編碼長度縮到最小:

*** 決定起始碼

1. 一開始數字連續4個以上時,使用C類。
2. 先遇上ASCII 0~31者,使用A類,先遇上ASCII 96~127者,使用B類。都遇不上,一律採用A類。

*** 中途轉碼考慮

A、B類 -

1. 數字6個以上時,改用C類。
2. 遇上ASCII 0~31者,改用A類,遇上ASCII 96~127,改用B類。

C類 -

3. 只剩0~1個數字時,往後找2的情況,若無,一律使用A類。
4. 遇上ASCII 0~31者,改用A類,遇上ASCII 96~127,改用B類。

在ASP將字串轉成 Big5 位元串以十六進制表示

古老的 ASP 程式通常都在 ANSI 模式下。

近年來已朝向 Unicode (UTF-8) 的環境開發
在第一行加入: <%@LANGUAGE="VBScript" CODEPAGE="65001" %>
可以讓程式碼、語言核心、HTTP IO 都使用 Unicode 了。

如果有一個特殊狀況要把 Unicode 網頁的文字轉回去 Big5 怎麼辦呢?


'=== 將(Unicode)字串轉成 Big5 位元串以十六進制表示
Private Function HexBig5(strData)
Dim o,B,I,out
Set o = Server.CreateObject("ADODB.Stream")

o.Charset = "big5"
o.Mode = 3 '1讀 2寫 3讀寫
o.Type = 2 '1二進制 2純文字
o.Open
o.WriteText strData

'o.SaveToFile Server.MapPath("t.txt"),2 '測試輸出文字檔
o.Position = 0 '從頭開始
o.Charset = "big5"
o.Type = 1
B = o.Read

out = ""
For I= 1 To o.size
out = out & HexB(AscB(MidB(B,I,1)))
Next
HexBig5 = out
End Function

Private Function HexB(value)
hexB = Right("0" & HEX(value),2)
End Function