Code39(也稱為Alpha39、Code 3 of 9、Code3/9、Type 39、USS Code39或USD-3)是 ISO/IEC 16388:2007 中定義的一種不固定長度的條碼。可以表示43个字元,包含大寫拉丁字母(A到Z)、数字(0到9)和幾個特殊字元(-、.、$,/、+、%與空格)。另有一個外加符號作為終止符號(標示為「*」)。每个字元由九个部份组成:五條線與和四個空格,當中三個部份較寬(二進位1),六個較窄。窄与宽之间的比例并不重要,在1:2和1:3之間都可。
性質
Code39本身不包含校验位(与Code 128不同),但是由于单點错误不會對應到另一個有效的編碼,因此可以算是自我校驗碼。Code39的最严重缺点可能是其数据密度低,與Code 128相比需要更多空間。這表示小型商品不易使用Code39條碼。但是,某些郵政系統仍然使用Code39(尽管萬國郵政聯盟建议在所有情况下都使用Code 128 [1] )。Code39的幾個个优点是,只要增加條碼字體,就能夠用現有的印刷系統印出條碼,因為Code39不需要計算校驗位置。[2]而且幾乎所有的條碼掃描器都能解碼。
歷史
Code39由Intermec的David Allais與Ray Stevens在1974年開發。原始设计是使用兩條粗線與一個寬空格來表示一個字元,總共可以表示40個符號。再保留其中一個作為開始與終止符號,剩下39個符號,這也是Code39的名稱来源。[3]之後加入了四个标点符号,並排除粗線與三格寬的空格的編碼,將字元集扩展为43个字元。Code39被标准化为ANSI MH 10.8 M-1983和MIL-STD-1189。[4]後者已被取消,并由ANSI/AIM BC1/1995〈Uniform Symbology Specification — Code39〉代替。[5]
编码方式
下面显示的「*」字元不是真正的可编码字元,而是開始與終止符號,其不对称性使阅读器可以确定所扫描条形码的方向。這個符號通常會對映到「*」字元,並且會與條碼內容一起以人類可讀格式印出。
一般來說,兩條粗線的位置可以視為對數字1至10編碼;而宽空格的位置(具有四个可能)可视为将字元分为四組(从左到右):
- 「字母(+30)」:U至Z
- 「数字(+0)」:1至9與0
- 「字母(+10)」:A至J
- 「字母(+20)」:K至T
最後剩下的四个字元只由細線、三個寬空格與一格窄空格组成。窄空格有四個可能的位置。
例如,字母P(第16個字母)的粗線位置與數字6相同,寬空格則放在「字母(+20)」的位置。
在表示数字时,0會用「數字(+0)」的「10」表示。另外因為「字母(+30)」组中只有六个字母(U至Z),因此该组中的其他四个位置(36至39)用於表示「-」、「.」、空格以及開始/終止符號。
兩條粗線則用五個可能的位置使用五取二碼(每一位分別表示1、2、4、7或0)表示1到10之间的数字。例如数字6被编码为「|▮▮||」,粗線位在2和4的位置(2+4=6)。而「||▮▮|」的數值為4+7=11表示數字0 。 在对(+10至+30)的字母进行编码时,算式需要添加「 -1」,因此字母「A」的編碼為「▮|| |▮」,對應的數值為1+10−1=10。
下表是Code39的符號表。每個字元(除了開始/終止符號)的數值會在下節的校验演算法中使用。
Code39 字元 (與校驗和)
線條
|
寬空格
|
|| |||
|
+0
|
||| ||
|
+10
|
|||| |
|
+20
|
| ||||
|
+30
|
▮|||▮
|
1
|
▮| ||▮
|
1
|
1
|
▮|| |▮
|
A
|
10
|
▮||| ▮
|
K
|
20
|
▮ |||▮
|
U
|
30
|
|▮||▮
|
2
|
|▮ ||▮
|
2
|
2
|
|▮| |▮
|
B
|
11
|
|▮|| ▮
|
L
|
21
|
| ▮||▮
|
V
|
31
|
▮▮|||
|
3
|
▮▮ |||
|
3
|
3
|
▮▮| ||
|
C
|
12
|
▮▮|| |
|
M
|
22
|
▮ ▮|||
|
W
|
32
|
||▮|▮
|
4
|
|| ▮|▮
|
4
|
4
|
||▮ |▮
|
D
|
13
|
||▮| ▮
|
N
|
23
|
| |▮|▮
|
X
|
33
|
▮|▮||
|
5
|
▮| ▮||
|
5
|
5
|
▮|▮ ||
|
E
|
14
|
▮|▮| |
|
O
|
24
|
▮ |▮||
|
Y
|
34
|
|▮▮||
|
6
|
|▮ ▮||
|
6
|
6
|
|▮▮ ||
|
F
|
15
|
|▮▮| |
|
P
|
25
|
| ▮▮||
|
Z
|
35
|
|||▮▮
|
7
|
|| |▮▮
|
7
|
7
|
||| ▮▮
|
G
|
16
|
|||▮ ▮
|
Q
|
26
|
| ||▮▮
|
-
|
36
|
▮||▮|
|
8
|
▮| |▮|
|
8
|
8
|
▮|| ▮|
|
H
|
17
|
▮||▮ |
|
R
|
27
|
▮ ||▮|
|
.
|
37
|
|▮|▮|
|
9
|
|▮ |▮|
|
9
|
9
|
|▮| ▮|
|
I
|
18
|
|▮|▮ |
|
S
|
28
|
| ▮|▮|
|
␣
|
38
|
||▮▮|
|
10
|
|| ▮▮|
|
0
|
0
|
||▮ ▮|
|
J
|
19
|
||▮▮ |
|
T
|
29
|
| |▮▮|
|
*
|
|
|
|||||
|
|
| | | ||
|
$
|
39
|
| | || |
|
/
|
40
|
| || | |
|
+
|
41
|
|| | | |
|
%
|
42
|
每個字元會用一個窄空格隔開。例如,字母「A」完整编码实际上會加上開始/終止符號,變成「*A*」,對應的條碼為「| |▮▮|▮|| |▮| |▮▮|」。只要没有这些空格,就无法正确读取條碼,因此條碼字體必須要包含這個窄空格。
Code39 mod 43
Code39有時會加上模43的校验位。這個功能需要在另外在讀取器中開啟。加上校验位的條碼称为「Code39 mod 43」 。
每個字元都被分配到一個數值。可以參考上表。
这是校验和的计算方法:
- 計算條碼中所有字元(除了開始/終止符號)的數值總和
- 將結果除以43
- 餘數即為校验和字元的數值
完整的ASCII Code39
Code39僅能表示34個字元。在ASCII Code39中,0至9、A至Z、「.」、「,」以及空格的符號與Code39相同。小寫字母、其他標點符號和控制字元則由兩個Code39符號表示。
編碼表
數值 |
字元 |
編碼
|
數值 |
字元 |
編碼
|
數值 |
字元 |
編碼
|
數值 |
字元 |
編碼
|
0
|
NUL |
%U
|
32
|
[space] |
[space]
|
64
|
@ |
%V
|
96
|
` |
%W
|
1
|
SOH |
$A
|
33
|
! |
/A
|
65
|
A |
A
|
97
|
a |
+A
|
2
|
STX |
$B
|
34
|
" |
/B
|
66
|
B |
B
|
98
|
b |
+B
|
3
|
ETX |
$C
|
35
|
# |
/C
|
67
|
C |
C
|
99
|
c |
+C
|
4
|
EOT |
$D
|
36
|
$ |
/D
|
68
|
D |
D
|
100
|
d |
+D
|
5
|
ENQ |
$E
|
37
|
% |
/E
|
69
|
E |
E
|
101
|
e |
+E
|
6
|
ACK |
$F
|
38
|
& |
/F
|
70
|
F |
F
|
102
|
f |
+F
|
7
|
BEL |
$G
|
39
|
' |
/G
|
71
|
G |
G
|
103
|
g |
+G
|
8
|
BS |
$H
|
40
|
( |
/H
|
72
|
H |
H
|
104
|
h |
+H
|
9
|
HT |
$I
|
41
|
) |
/I
|
73
|
I |
I
|
105
|
i |
+I
|
10
|
LF |
$J
|
42
|
* |
/J
|
74
|
J |
J
|
106
|
j |
+J
|
11
|
VT |
$K
|
43
|
+ |
/K
|
75
|
K |
K
|
107
|
k |
+K
|
12
|
FF |
$L
|
44
|
, |
/L
|
76
|
L |
L
|
108
|
l |
+L
|
13
|
CR |
$M
|
45
|
- |
-
|
77
|
M |
M
|
109
|
m |
+M
|
14
|
SO |
$N
|
46
|
. |
.
|
78
|
N |
N
|
110
|
n |
+N
|
15
|
SI |
$O
|
47
|
/ |
/O
|
79
|
O |
O
|
111
|
o |
+O
|
16
|
DLE |
$P
|
48
|
0 |
0
|
80
|
P |
P
|
112
|
p |
+P
|
17
|
DC1 |
$Q
|
49
|
1 |
1
|
81
|
Q |
Q
|
113
|
q |
+Q
|
18
|
DC2 |
$R
|
50
|
2 |
2
|
82
|
R |
R
|
114
|
r |
+R
|
19
|
DC3 |
$S
|
51
|
3 |
3
|
83
|
S |
S
|
115
|
s |
+S
|
20
|
DC4 |
$T
|
52
|
4 |
4
|
84
|
T |
T
|
116
|
t |
+T
|
21
|
NAK |
$U
|
53
|
5 |
5
|
85
|
U |
U
|
117
|
u |
+U
|
22
|
SYN |
$V
|
54
|
6 |
6
|
86
|
V |
V
|
118
|
v |
+V
|
23
|
ETB |
$W
|
55
|
7 |
7
|
87
|
W |
W
|
119
|
w |
+W
|
24
|
CAN |
$X
|
56
|
8 |
8
|
88
|
X |
X
|
120
|
x |
+X
|
25
|
EM |
$Y
|
57
|
9 |
9
|
89
|
Y |
Y
|
121
|
y |
+Y
|
26
|
SUB |
$Z
|
58
|
: |
/Z
|
90
|
Z |
Z
|
122
|
z |
+Z
|
27
|
ESC |
%A
|
59
|
; |
%F
|
91
|
[ |
%K
|
123
|
{ |
%P
|
28
|
FS |
%B
|
60
|
< |
%G
|
92
|
\ |
%L
|
124
|
| |
%Q
|
29
|
GS |
%C
|
61
|
= |
%H
|
93
|
] |
%M
|
125
|
} |
%R
|
30
|
RS |
%D
|
62
|
> |
%I
|
94
|
^ |
%N
|
126
|
~ |
%S
|
31
|
US |
%E
|
63
|
? |
%J
|
95
|
_ |
%O
|
127
|
DEL |
%T, %X, %Y, %Z
|
軟體
下列自由與開源的軟體可以產生Code39條碼:
参考文献