Code 39

Przykład zapisu znaków alfanumerycznych w kodzie „Code39”. Znaki „*” są oznaczeniami Start/Stop, natomiast „$” jest znakiem kontrolnym wyliczonym na podstawie modulo43

Code 39 (znany też jako „USS Code 39”, „Code 3/9”, „Kod 3 z 9”, „USD-3”, „Alpha39”) – alfanumeryczny kod kreskowy o stałej szerokości pojedynczego znaku. Kod ten powstał w 1974 roku, a rozpowszechnił się po zastosowaniu go przez Departament Obrony USA do oznaczania przesyłek od dostawców. Obecnie jest wykorzystywany w branży motoryzacyjnej do oznaczania części. Największą wadą kodu jest stosunkowo mała gęstość zapisu danych. Z tego względu kod ten nie nadaje się do umieszczania na małych przedmiotach. Zaletą kodu jest fakt, iż może on zostać odczytany przez prawie każdy czytnik kodów kreskowych.

Budowa kodu

Wykorzystując podstawową wersję kodu można zakodować 43 znaki alfanumeryczne (duże litery od A do Z, cyfry, znaki specjalne: -, ., spacja, $, /, +, %) oraz symbol *, który służy do oznaczenia początku i końca kodu. Każdy znak składa się z dziewięciu pasków (występuje na przemian 5 pasków czarnych i 4 paski białe), przy czym 3 spośród nich mają większą szerokość (stąd nazwa kod 3 z 9). Stosunek szerokości pasków grubych do cienkich musi mieścić się w przedziale od 2:1 do 3:1.

W podstawowej wersji kod nie zawiera sumy kontrolnej. Jednakże jest on tak skonstruowany, iż pojedynczy błędnie odczytany pasek nie spowoduje rozpoznania znaku jako innego.

Tablica znaków

Znak * jest wykorzystywany jedynie do oznaczenia początku i końca kodu. Ze względu na jego asymetryczną postać czytnik kodów kreskowych jest w stanie określić kierunek odczytu kodu.

Poniższa tabela prezentuje sposób zapisu wszystkich 44 znaków kodowanych w Kodzie 3 z 9:

Legenda
Format1Format2Pasek
WBszeroki – czarny
Nbwąski – czarny
wWszeroki – biały
nwwąski – biały
Tablica znaków
WartośćZnakFormat1Format2
00NnNwWnWnNbwbWBwBwb
11WnNwNnNnWBwbWbwbwB
22NnWwNnNnWbwBWbwbwB
33WnWwNnNnNBwBWbwbwb
44NnNwWnNnWbwbWBwbwB
55WnNwWnNnNBwbWBwbwb
66NnWwWnNnNbwBWBwbwb
77NnNwNnWnWbwbWbwBwB
88WnNwNnWnNBwbWbwBwb
99NnWwNnWnNbwBWbwBwb
10AWnNnNwNnWBwbwbWbwB
11BNnWnNwNnWbwBwbWbwB
12CWnWnNwNnNBwBwbWbwb
13DNnNnWwNnWbwbwBWbwB
14EWnNnWwNnNBwbwBWbwb
15FNnWnWwNnNbwBwBWbwb
16GNnNnNwWnWbwbwbWBwB
17HWnNnNwWnNBwbwbWBwb
18INnWnNwWnNbwBwbWBwb
19JNnNnWwWnNbwbwBWBwb
20KWnNnNnNwWBwbwbwbWB
21LNnWnNnNwWbwBwbwbWB
22MWnWnNnNwNBwBwbwbWb
23NNnNnWnNwWbwbwBwbWB
24OWnNnWnNwNBwbwBwbWb
25PNnWnWnNwNbwBwBwbWb
26QNnNnNnWwWbwbwbwBWB
27RWnNnNnWwNBwbwbwBWb
28SNnWnNnWwNbwBwbwBWb
29TNnNnWnWwNbwbwBwBWb
30UWwNnNnNnWBWbwbwbwB
31VNwWnNnNnWbWBwbwbwB
32WWwWnNnNnNBWBwbwbwb
33XNwNnWnNnWbWbwBwbwB
34YWwNnWnNnNBWbwBwbwb
35ZNwWnWnNnNbWBwBwbwb
36-NwNnNnWnWbWbwbwBwB
37.WwNnNnWnNBWbwbwBwb
38(spacja)NwWnNnWnNbWBwbwBwb
39$NwNwNwNnNbWbWbWbwb
40/NwNwNnNwNbWbWbwbWb
41+NwNnNwNwNbWbwbWbWb
42%NnNwNwNwNbwbWbWbWb
*NwNnWnWnNbWbwBwBwb

Pomiędzy znakmi wstawiany jest dodatkowy wąski biały pasek. Nie zostało to co prawda określone w standardzie, jednakże czytniki mogą nie odczytać kodu, który nie zawiera takich przerw. Dla przykładu kod składający się z litery „A” będzie wyglądał następująco: „[bWbwBwBwb]w[BwbwbWbwB]w[bWbwBwBwb]” i zostanie odczytany jako „*A*”.

Suma kontrolna (Code 39 mod 43)

Czasem do kodu 3 z 9 dodawana jest dodatkowa suma kontrolna (odmiana kodu: Code 39 mod 43). Oblicza się ją następująco:

  • Sumuje się wartości (od 0 do 42) wszystkich znaków występujących w kodzie (z wyjątkiem znaków start/stop)
  • Od wyniku oblicza się wartość modulo 43
  • Otrzymany wynik jest wartością znaku sumy kontrolnej

Znak sumy kontrolnej dopisuje się do kodu przed znakiem stopu.

W Visual Basicu można przedstawić to w następujący sposób:

Const charSet As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%"
Function Mod43(C39 As String) As String
  For i = 1 To Len(C39)
    total = InStr(charSet, Mid(C39, i, 1)) - 1 + total
  Next i
  Mod43 = C39 & Mid$(charSet, (total Mod 43 + 1), 1)
End Function

Zapis całej tablicy znaków ASCII w Code 39

Istnieje rozwinięcie kodu 3 z 9 (Code 39 plus) pozwalające zakodować wszystkie 128 znaków kodu ASCII. Znacznik początku i końca kodu oraz 39 standardowych znaków (A–Z, 0–9, -, . i spacja) kodowanych jest identycznie, jak w odmianie podstawowej. Pozostałe symbole reprezentowane są przez sekwencje dwóch znaków podstawowych.

Kodowanie Code 39 plus
NrZnakKodowanie
0NUL%U
1SOH$A
2STX$B
3ETX$C
4EOT$D
5ENQ$E
6ACK$F
7BEL$G
8BS$H
9HT$I
10LF$J
11VT$K
12FF$L
13CR$M
14SO$N
15SI$O
16DLE$P
17DC1$Q
18DC2$R
19DC3$S
20DC4$T
21NAK$U
22SYN$V
23ETB$W
24CAN$X
25EM$Y
26SUB$Z
27ESQ%A
28FS%B
29GS%C
30RS%D
31US%E
NrZnakKodowanie
32[spacja][spacja]
33!/A
34"/B
35#/C
36$/D
37%/E
38&/F
39'/G
40(/H
41)/I
42*/J
43+/K
44,/L
45--
46..
47//O
4800
4911
5022
5133
5244
5355
5466
5577
5688
5799
58:/Z
59;%F
60<%G
61=%H
62>%I
63?%J
NrZnakKodowanie
64@%V
65AA
66BB
67CC
68DD
69EE
70FF
71GG
72HH
73II
74JJ
75KK
76LL
77MM
78NN
79OO
80PP
81QQ
82RR
83SS
84TT
85UU
86VV
87WW
88XX
89YY
90ZZ
91[%K
92\%L
93]%M
94^%N
95_%O
NrZnakKodowanie
96`%W
97a+A
98b+B
99c+C
100d+D
101e+E
102f+F
103g+G
104h+H
105i+I
106j+J
107k+K
108l+L
109m+M
110n+N
111o+O
112p+P
113q+Q
114r+R
115s+S
116t+T
117u+U
118v+V
119w+W
120x+X
121y+Y
122z+Z
123{%P
124|%Q
125}%R
126~%S
127DEL%T

Linki zewnętrzne