Guide No sign-up needed

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
  1. The short answer
  2. Compared
  3. Why Code 128 is so much denser
  4. When Code 39 is still the right answer
  5. The Full ASCII trap
  6. Check characters
  7. Practical recommendation
  8. Sources

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 128Code 39
Character setAll 128 ASCII characters0–9, A–Z, space and - . $ / + %
Lowercase lettersYesNo (not in standard Code 39)
Check characterMandatory, built inOptional modulo 43
DensityHigh — Code Set C packs two digits per characterLow
Typical width for 10 digitsRoughly half of Code 39Roughly twice Code 128
GS1 useYes, as GS1-128No
Legacy supportUniversal on modern scannersUniversal, 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.

More guides