Code 39 (also called Code 3 of 9) is one of the oldest alphanumeric barcode formats. It encodes uppercase A–Z, digits 0–9, and seven symbols: - . $ / + % and space.
Use Code 128 instead for new projects unless your scanner specifically requires Code 39 — it's lower-density and lacks check-digit validation in the basic version.
Free forever. No signup, no watermark on the downloaded image, no expiry on the barcode you generate today.
At a glance
| Standard | ISO/IEC 16388 (2007) — ISO/IEC 16388 |
|---|---|
| Character set | 43 characters — A–Z, 0–9, space and - . $ / + % |
| Structure | Discrete; each character is 9 elements (5 bars + 4 spaces), 3 of them wide |
| Check digit | Optional modulo-43; the symbology is self-checking without it |
| Start/stop character | Asterisk (*), added automatically by the encoder |
| Density | Low — roughly half as dense as Code 128 for the same data |
| Year introduced | 1974 (Intermec); mandated by US DoD LOGMARS (MIL-STD-1189) |
“Code 39 is a discrete, variable-length symbology; each symbol character is composed of nine elements — five bars and four spaces — three of which are wide.”
When you actually need Code 39
Many older industrial and government systems require Code 39 — defense supply chains (LOGMARS), some healthcare and library systems, and some legacy ERP integrations. If your specification document names Code 39, use it.
For greenfield work — internal labels, modern WMS systems, e-commerce — pick Code 128. It is shorter, more reliable, and supports lowercase.
Character set
Uppercase A–Z, digits 0–9, and these symbols: - . $ / + % * and space. Lowercase is not supported; the encoder rejects it.
An extended Code 39 mode supports the full ASCII set by combining two characters per symbol, but the result is no longer compatible with basic Code 39 scanners.
Frequently asked questions
- Why won't my barcode encode lowercase letters?
- Code 39 doesn't support lowercase in its standard form. Switch to Code 128 or convert your data to uppercase.
- Does Code 39 have a check digit?
- Optionally. The Modulo-43 check character can be enabled but most readers don't validate it. Code 128 has built-in validation always.