Code 39 Barcode Generator
Code 39 is the elder statesman of alphanumeric barcodes — simple, forgiving to print, readable by practically anything ever sold with a scan head, and still required by plenty of industrial and legacy systems. Its price is a hard 43-character limit and a wide footprint. Both are stated below, not glossed over.
Code 39 generator
Generated locally in your browser — nothing you type is transmitted or stored.
The character set — all of it
Standard Code 39 encodes exactly these 43 characters (␣ marks the space):
ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789␣-.$/+%
No lowercase, no commas, no #, no accents. When your input contains lowercase
letters this tool uppercases them and reports the change in the readout; when it contains
anything else, generation stops and the offending characters are named. A "full ASCII" Code 39
variant exists that pairs characters to reach the rest of the ASCII table, but it needs a
scanner configured to expect it — this tool sticks to the standard set that every reader
understands.
Nine elements, three wide
The name is the design: each character is nine elements — five bars, four spaces — of which exactly three are wide. That fixed 3-of-9 structure makes every character self-checking (a single misread element cannot produce another valid character), which is why Code 39 traditionally ships without a check digit. It is also why the symbology is so wide: nine elements plus an inter-character gap per character adds up fast, and this tool caps input at 60 characters because beyond that the print becomes unscannable in practice.
What this generator does not add
No mod-43 check digit (optional in the standard, surprising to systems that don't expect it), no full-ASCII extension, no start/stop asterisks in your data — the renderer applies the delimiters itself. What you type, uppercased if needed, is exactly what a scanner will beep back. The downloads include a ten-module quiet zone on each side; keep it.
Code 39 FAQ
Exactly which characters does Code 39 support?
Forty-three: the uppercase letters A–Z, the digits 0–9, space, and the seven symbols - . $ / + %. That is the whole menu. This tool converts lowercase to uppercase (and tells you it did); any other character is rejected by name rather than silently dropped.
Why is my Code 39 so wide?
Each character spends nine elements, three of them wide — plus a gap — so Code 39 typically needs half again to twice the width of Code 128 for the same text. That inefficiency is structural; the fix, when you control both ends, is switching symbology, not squeezing the print.
What are the asterisks I see in some Code 39 text?
Start and stop delimiters. The symbol begins and ends with a reserved * pattern so scanners know the boundaries and direction. The renderer adds them automatically — never type them into your data.
Does Code 39 have a check digit?
Not by default — most Code 39 deployments rely on the symbology’s self-checking bars alone. An optional mod-43 check digit exists for systems that demand it; this tool does not append one, and says so, because a check digit the receiving system does not expect reads as a stray extra character.
Why use Code 39 at all in 2026?
Compatibility. Decades of industrial, logistics, and government systems (including formats like the DoD’s LOGMARS conventions) were built on Code 39, and labels that feed them must match. For anything new, Code 128 encodes more, in less space, with a mandatory internal check.
Verify before production: test the printed label with the scanner that will actually read it — especially with legacy hardware, which is the usual reason Code 39 is chosen. Everything runs locally in your browser; see the methodology page.