Der Code 39 ist eine ältere Codeart, die pro einem Codewort nur die Ziffern 0 bis 9, die Großbuchstaben A bis Z und die Zeichen "space $ % + - . /" kodieren kann.       
(space steht für das Leerzeichen bzw. Leerschritt)

Es gibt den erweiterten ASCII Modus. Von der Anwendung ist aber abzuraten, da pro Zeichen 2 Codewörter notwendig sind.

Ein Zeichen wird immer in 5 Strichen und 4 Lücken kodiert. Zwischen  den Zeichen ist immer eine Trennlücke (gelb in den Bildern hervorgehoben) enthalten, damit der letzte Strich eines Zeichens nicht direkt, ohne Lücke, auf den ersten Strich des folgenden Zeichens anschließt. Bei anderen Codearten ist das geschickter gelöst. Ein Zeichen endet z.B. mit einer Lücke  und beginnt mit einem Strich. Eine Trennlücke wie dies beim Code 39 zwingend ist wird dann nicht mehr benötigt.       

Anhand der folgenden neun, vollständigen Codes wird der kompette Zeichensatz des Code 39 gezeigt (das zehnte Codebild zeigt einen Sonderfall).

Die blauen Striche mit den dazwischenliegenden weißen Lücken sind jeweils das Start- und Stoppzeichen. Die Datenzeichen bestehen aus vier Lücken die rot dargestellt sind und 5 dunklen Strichen die schwarz dargestellt werden. Die gelben Striche sind die Trennlücken (Gap oder intercharacter gap), die benötigt werden weil die Datenzeichen mit einem Strich beginnen und enden. Die Trennlücken haben normalerweise die Breite von einem Modul. Erlaubt sind allerdings bis zu 5,3 Module. Diese Breitenvariation der Trennlücke wird in der Praxis so gut wie nie benutzt. Die große Variation der Trennlücke ist in den historischen Drucksystemen begründet, die den Code mit einer speziellen Schreibmaschine erzeugt haben.       

Unter jedem Code ist eine Tabelle eingefügt die das Bitmuster der Zeichen zeigt. Eine 1 steht dabei für ein breites Element und eine 0 für ein schmales Element. Das Bitmuster wird in der Abfolge der Strich und Lücken gezeigt. Das erste Element ist immer ein Strich. (B - Balken, L = Lücke)

Code 39 01
Code 39 Bittabelle Ziffer 1 bis 5
ZeichenBLBLBLBLB
1100100001
2001100001
3101100000
4000110001
5100110000

 


Code39-02a

Code 39 Bittabelle Ziffer 6 bis 9 und 0
ZeichenBLBLBLBLB
6001110000
7000100101
8100100100
9001100100
0000110100

 


Code39-03a       
 

Code 39 Bittabelle Buchstaben A bis E
ZeichenBLBLBLBLB
A100001001
B001001001
C101001000
D000011001
E100011000



Code39-04a

Code 39 Bittabelle Buchtaben F bis J
ZeichenBLBLBLBLB
F001011000
G000001101
H100001100
I001001100
J000011100


Code39-05a

Code 39 Bittabelle Buchstaben K bis O
ZeichenBLBLBLBLB
K100000011
L001000011
M101000010
N000010011
O100010010


code39-06a       

 

Code 39 Bittabelle Buschstaben P bis T
ZeichenBLBLBLBLB
P001010010
Q000000111
R100000110
S001000110
T000010110


Code39-07a       
 

Code 39 Bittabelle Buchstaben U bis Y
ZeichenBLBLBLBLB
U110000001
V011000001
W111000000
X010010001
Y110010000


Code39-08a

Code 39 Bittabelle Buchstabe Z und Sonderzeichen
ZeichenBLBLBLBLB
Z011010000
SPACE011000100
$010101000
%000101010
+010001010


Code38-09a       

 

Code 39 Bittabelle Sonderzeichen
ZeichenBLBLBLBLB
-010000101
. (Punkt)110000100
/010100010


Das folgende Beispiel zeigt einen Code der dreimal das Zeichen "*" kodiert. Dieses Zeichen wird als Start und Stoppzzeichen benutzt. Innerhalb des Code darf das Zeichen nicht benutzt werden, weil der Scanner dann entweder an der falschen STelle anfängt zu dekodieren oder an der falschen Stelle aufhört. In einer geschlossenen Anwendung in der die Scannerauswahl unter Kontrolle ist könnte man Scanner aussuchen die so programmiert sind, dass das Start- bzw. Stoppzeichen im Code toleriert wird. in einer offenen Anwendung ist der Scannertyp nicht bekannt und daher ist ein Start/Stoppzeichen im Code verboten.       
 

Code39-10a       

 

Code 39 Bittabelle Start- und Stoppzeichen
ZeichenBLBLBLBLB
* (Start und Stopp)010010100


Die gelben Striche sind die Trennlücken (engl Intercharacter Gap abgekürzt Ig).       

Alle Beispiele sind als vollständige Codes gezeigt. Es handelt sich aber nur um Prinzipbilder, die lesbar sein können aber nicht müssen.

Der Code 39 gehört zu Kategorie der Codearten mit 2 Strichbreiten. Der breite Strich darf zwischen 2 bis 3 mal breiter sein als der dünne Strich. Das Verhältnis zwischen dünnen und breiten Strich wird als Ratio bezeichnet.       
Links und rechts des Strichcodes muss ein heller Bereich freibleiben. Man bezeichnet diesen hellen Bereich als Ruhezone oder Hellfeld. Die Mindestbreite des Hellfeldes ist eine relative Angabe in Bezug auf die Idealbreite eines dünnen Striches (Modulbreite). Mindestens 10 x der Breite des schmalen Striches muss links wie auch rechts des Codes freibleiben.       
Der Code kann eine Prüfziffer beinhalten. Diese wird üblicherweise in dem Modulo 43 Verfahren berechnet. Wenn nur Ziffern kodiert werden dann wird auch Modulo 10 verwendent.       

Der Code ist in einer ISO/IEC Norm normiert: ISO/IEC 16388       
 


Die Anfälligkeit gegen zu kurzes Lesen ist deutlich geringer als bei dem  2/5i Code. Dies begründet sich dadurch, dass das Start- und Stoppzeichen genauso aufgebaut ist wie ein Datenzeichen und keine Teilmenge eines Datenzeichens ist.  Die Muster des Start- und Stoppzeichens (Blaue Striche, gelbe Lücken in den Bildern) wiederholen sich oft mehrfach in einem Code. Man sollte daher einen waagerechten Strich über und unter dem Code drucken der jeweils deutlich breiter ist als ein breiter Strich im Code. Des weiteren sollte der Scanner nur die Länge des Codes akzeptieren die vorgesehen ist.       
Die Prüfziffer ist auch mit Modulo 43 nur ein geringer Schutz gegen das Erkennen von fehlerhaften Lesungen.       

Die größte Schwäche des Code 39 ist sein immenser Platzbedarf. Man stößt daher bei geringfügig erhöhten Datenmengen  sehr schnell an Grenzen.       

Die Codeversion Code 39 Full ASCII erlaubt die Kodierung von Kleinbuchstaben. Dazu wird immer ein Zeichenpärchen aus z.B. $ und einem Großbuchstaben benutzt. Diese Kombination wird vom Scanner in ein Zeichen gewandelt. Der Scanner muss auf auf Code39 Full ASCII eingestellt sein. Der ohnehin schon sehr große Code wird noch einmal doppelt so groß. Die Code 39 Full ASCII Version sollte daher vermieden werden. Der Code 128 kodiert den vollen ASCII Zeichensatz viel effektiver.