Code 128 vs Code 39
One is denser, checksummed and handles the full ASCII set. The other is older, simpler, and still required by systems that will not change.
On this page
The short answer
Choose Code 128 unless something you cannot change requires Code 39. Code 128 is roughly twice as dense for the same data, includes a mandatory check character, and covers all 128 ASCII characters.
Compared
| Code 128 | Code 39 | |
|---|---|---|
| Character set | All 128 ASCII characters | 0–9, A–Z, space and - . $ / + % |
| Lowercase letters | Yes | No (not in standard Code 39) |
| Check character | Mandatory, built in | Optional modulo 43 |
| Density | High — Code Set C packs two digits per character | Low |
| Typical width for 10 digits | Roughly half of Code 39 | Roughly twice Code 128 |
| GS1 use | Yes, as GS1-128 | No |
| Legacy support | Universal on modern scanners | Universal, including very old equipment |
Why Code 128 is so much denser
Code 128 has three code sets. Set C encodes a pair of digits in a single symbol character, so an all-numeric value of even length takes about half the width. Set A covers uppercase and control characters, Set B adds lowercase, and the encoder switches between them mid-symbol as needed. Our generator's Auto mode does this for you and tells you when Set C is being used.
When Code 39 is still the right answer
- An existing system, form or contract specifies it.
- Very old scanning hardware that predates reliable Code 128 support.
- Environments where a symbology needs no check character configuration at all.
Code 39's real advantage is inertia: it has been readable by everything for four decades. That is a genuine benefit in an industrial setting where equipment is replaced on a twenty-year cycle.
The Full ASCII trap
"Full ASCII Code 39" encodes lowercase and symbols using pairs of standard Code 39 characters. It only works when the scanner is explicitly configured to decode those pairs — otherwise it reads back the raw pairs and nobody notices until data is wrong downstream. This site produces standard Code 39 only, and says so, rather than shipping something that depends on a scanner setting we cannot see.
Check characters
Code 128's check character is part of the symbol and is always present. Code 39's modulo-43 check character is optional and must be enabled on both the printer and the scanner — enable it on one only and every scan fails. Our generator offers it and shows you the character it appends.
Practical recommendation
New internal system: Code 128. Anything crossing a trading-partner boundary with GS1 data: GS1-128. Replacing labels in a system that already reads Code 39: keep Code 39 until the scanners are replaced, then move.
Sources
Both symbologies are specified in ISO/IEC 15417 (Code 128) and ISO/IEC 16388 (Code 39). GS1-128 application rules are in the GS1 General Specifications.