Industrial Code 39 Barcode Generator
Code 39 was the first barcode that could handle letters as well as numbers, and decades later it is still everywhere older systems live — defense logistics, automotive plants, and asset tags on the back of office equipment.
Why it survives
Its appeal is sheer simplicity. There is no mandatory checksum to calculate, the character set is small and predictable (A–Z, 0–9, and a handful of symbols like - . $ / + %), and just about any scanner ever made can read it without special firmware. Each character is also self-checking — a single misprinted bar produces an invalid character rather than a wrong one — which is why the format was trusted in the first place. It is wider and less dense than Code 128, but for a short bin number or a legacy system that has worked for twenty years, that rarely matters.
Two institutional standards keep it alive: the US Department of Defense LOGMARS specification for military supply labelling, and HIBC labels in parts of the healthcare supply chain. If a customer hands you a spec sheet that says Code 39, this is why.
Technical specification
| Character set | 43 characters: A–Z, 0–9, space, and - . $ / + % |
| Length | Variable — but each character needs 13–16 bar widths, so keep it short |
| Check digit | Optional (modulo 43); most implementations skip it |
| Start/stop character | An asterisk (*) at each end, added automatically — never type it yourself |
| Minimum X-dimension | 0.19 mm technically; 0.25 mm+ recommended in practice |
| Quiet zone | 10× X-dimension on both sides |
Printing notes
Code 39's low density is actually a printing advantage: wide bars survive coarse printing, weathered surfaces, and cheap scanners. The trade-off is label width — ten characters of Code 39 need roughly the space of twenty in Code 128. Plan the label size before committing to the format, especially on narrow asset tags.
Frequently asked questions
Why does my scanner add or expect asterisks?
The asterisk is the start/stop character of the symbology. Some scanners are configured to transmit it, most strip it. Never include * in your data — the generator adds the real start/stop characters itself.
Can Code 39 encode lowercase letters?
Not natively — data is uppercased. There is an "extended" Code 39 mode that maps the full ASCII set onto character pairs, but it doubles the symbol width and not every scanner has it enabled. If you need lowercase, use Code 128 instead.
Should I add the optional check digit?
If your spec (e.g. LOGMARS) requires modulo 43, yes. Otherwise most modern systems skip it and rely on the symbology's self-checking. Just make sure scanner configuration matches — a scanner expecting a check digit will mangle codes that lack one.
Deciding between the classics? Read Code 128 vs Code 39. For labelling equipment and fixed assets, see asset tracking with barcodes.