Code39 streepjescode

type: note | domain: technology | topic: cad | lang: en | pub: 2026-01-09

Streepjescodes of barcodes zijn niet meer weg te denken uit onze maatschappij. 1D zijn de typische streepjescodes en 2D kennen we van de QR-codes. Ik beperk me tot 1D, specifiek "code39" vanwege de eenvoud. Een kort artikel met basale uitleg.

Waarom "code39"?

Hoe werkt "code39"?

Een voorbeeld zegt meer. Wens: het woord KEY omzetten in "code39". Gelukkig is er een lettertype "Libre Barcode 39". Het woord KEY wordt dan:

Met een paar spaties ertussen zie je de structuur beter:

Wat kenmerkend is voor die K, E en Y is kenmerkend voor alle karakters. Een analyse:

Daarmee weten we ook meteen waarom het "code39" heet: 3 dikke streepjes op een totaal van 9 streepjes.

Er zijn 43 karakters gedefinieerd: 0...9 en A...Z en - . $ / + % en tot slot een spatie. Uitgeschreven:

Programmeernotitie

In CAD-Lisp is zo'n karakter dus makkelijk vast te leggen. Als voorbeeld karakter "K".

"Waar" of bitcode "1" is in Lisp "T"(rue). "Onwaar" is bitcode "0" en in Lisp "nil". Je zou dus kunnen zeggen dat "K" deze bitcode heeft:

(1*dik, 6*dun, 2*dik).

Zwart en wit wisselen elkaar af dus kleur doet er niet toe, de volgorde "dik" en "dun" wel, en die ligt met die bitcode precies vast.

In CAD-Lisp ziet een "dotted pair" er dan zo uit voor karakter "K":

Scannen van "code39"

Hoe weet de scanner dat het "code39" is?

Omdat er asterisken (*) aan beide kanten van de code staat. Dus KEY wordt geschreven als *KEY*.

"*" is feitelijk karakter 44 maar wordt alleen gebruikt voor de specificatie van de gebruikte code.

Smartphones: Camera's hebben meestal moeite om het te herkennen. De reden is simpel, "code39" is wat gedateerd (1974) en wat beperkt. Echter, "Lens" herkent het wel. Wil je een app gebruiken? "Binary EYE" is open-source en een veelkunner.

Theoretisch kan je zo lange teksten maken in streepjescode maar dat is niet slim. Beperk jezelf tot zo'n 10 hexadecimale karakters (bij deze toepassing), dat is voor smartphones goed te doen, 15-20 maximaal voor gewone karakters is de suggestie.

Volledige karakterset

Als "dotted pairs", Lisp, one-liner (lang!):

(setq *c39-map*
  '(
  ("0" . (nil nil nil T T nil T nil nil))("1" . (T nil nil T nil nil nil nil T))("2" . (nil nil T T nil nil nil nil T))("3" . (T nil T T nil nil nil nil nil))("4" . (nil nil nil T T nil nil nil T))("5" . (T nil nil T T nil nil nil nil))("6" . (nil nil T T T nil nil nil nil))("7" . (nil nil nil T nil nil T nil T))("8" . (T nil nil T nil nil T nil nil))("9" . (nil nil T T nil nil T nil nil))("A" . (T nil nil nil nil T nil nil T))("B" . (nil nil T nil nil T nil nil T))("C" . (T nil T nil nil T nil nil nil))("D" . (nil nil nil nil T T nil nil T))("E" . (T nil nil nil T T nil nil nil))("F" . (nil nil T nil T T nil nil nil))("G" . (nil nil nil nil nil T T nil T))("H" . (T nil nil nil nil T T nil nil))("I" . (nil nil T nil nil T T nil nil))("J" . (nil nil nil nil T T T nil nil))("K" . (T nil nil nil nil nil nil T T))("L" . (nil nil T nil nil nil nil T T))("M" . (T nil T nil nil nil nil T nil))("N" . (nil nil nil nil T nil nil T T))("O" . (T nil nil nil T nil nil T nil))("P" . (nil nil T nil T nil nil T nil))("Q" . (nil nil nil nil nil nil T T T))("R" . (T nil nil nil nil nil T T nil))("S" . (nil nil T nil nil nil T T nil))("T" . (nil nil nil nil T nil T T nil))("U" . (T T nil nil nil nil nil nil T))("V" . (nil T T nil nil nil nil nil T))("W" . (T T T nil nil nil nil nil nil))("X" . (nil T nil T nil nil nil nil T))("Y" . (T T nil T nil nil nil nil nil))("Z" . (nil T T nil T nil nil nil nil))("-" . (nil T nil nil nil nil T nil T))("." . (T T nil nil nil nil T nil nil))(" " . (nil T T nil nil nil T nil nil))("*" . (nil T nil nil T nil T nil nil))("$" . (nil T nil T nil T nil nil nil))("/" . (nil T nil T nil nil nil T nil))("+" . (nil T nil nil nil T nil T nil))("%" . (nil nil nil T nil T nil T nil))
  )
)

Of hetzelfde in notatie 0 en 1: