Code 128 vs Code 39: Picking the Right Alphanumeric Barcode
Both carry letters and numbers, but Code 128 fits more data in less space and is the carrier of GS1 standards, while Code 39 is older, wider and still common in internal and industrial workflows.
By PureTools Editorial TeamUpdated 6 min read
The difference in one paragraph
Code 39 encodes 43 characters plus a shift state for full ASCII, uses wide and narrow elements that eat horizontal space, and carries an optional check character. Code 128 encodes all 128 ASCII characters in three code sets, packs roughly twice as much into the same width, has a mandatory modulo-103 check symbol, and is the symbology that GS1-128 logistics labels are built on.
If you are choosing for a new label and have no legacy constraint, Code 128 is almost always the better answer. Choose Code 39 when the readers, partners or printed forms you inherit expect it.
Side by side
| Property | Code 39 | Code 128 |
|---|---|---|
| Character set | 0-9, A-Z, - . $ / + % and space | All 128 ASCII characters |
| Density | Low; long for the same data | High; compact |
| Check digit | Optional modulo 43 | Mandatory modulo 103 |
| Start/stop | Asterisk (*) delimiters | Code-set dependent start patterns |
| GS1 standards | Not used for modern GS1 data | Carries GS1-128 with application identifiers |
| Typical uses | Internal asset tags, older industrial systems, some military and automotive workflows | Shipping labels, GS1-128 pallet tags, asset and serial tracking |
| Reader support | Universal | Universal |
When Code 128 is the right call
- You need to encode long serial numbers, batch codes or dates and space is limited.
- A trading partner requires GS1-128 with application identifiers such as (01) GTIN, (10) batch and (11) date.
- You want a guaranteed check symbol so a mis-scan is caught rather than silently accepted.
- The label has to be scanned off a screen, and Code 39 full-ASCII shift sequences make that awkward.
When Code 39 still makes sense
- An existing process, form or scanner configuration expects Code 39 and changing it is not yours to decide.
- The data is short upper-case alphanumeric, such as a simple internal asset tag, where the width penalty is irrelevant.
- You are printing very large labels for a long scan distance and have all the space you need.
Print rules that apply to both
- Never shrink artwork to fit. Reduce the bar width (module) and the height instead, keeping element ratios exact.
- Keep a quiet zone of at least 10 times the narrow bar width on each side.
- Print dark bars on a light, matte background. Reversed white-on-dark is unreliable for most 1D readers.
- Verify with the actual scanner that will read the label, not only a phone.
- For Code 39, remember the asterisk delimiters are added by the generator; do not type them yourself unless you mean them as data.
Frequently Asked Questions
Can a Code 39 barcode hold lower-case letters?
Standard Code 39 does not include lower case. Full ASCII Code 39 encodes them using shift characters, which produces longer symbols and is not supported everywhere. Code 128 handles lower case directly.
Which is better for shipping labels?
Code 128, because GS1-128 logistics labels use it and it carries application identifiers for batch, date and serial data in one symbol.
Do scanners read both automatically?
Most general-purpose 1D imagers are configured to read both symbologies, so a label that mixes them can be misinterpreted. Standardise on one per label type.
Is a check digit required?
Code 128 always includes one. Code 39 check characters are optional and often omitted, which means a damaged symbol can decode to a plausible but wrong value.
Sources & further reading
About the author — PureTools Editorial Team
Reviewed against GS1 and ISO symbology specs
Barcode and 2D code pages are reviewed against the GS1 General Specifications and the ISO/IEC bar code symbol standards, then re-checked when a specification is revised.
Editorial policy and corrections