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.
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.