Skip to content

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

PropertyCode 39Code 128
Character set0-9, A-Z, - . $ / + % and spaceAll 128 ASCII characters
DensityLow; long for the same dataHigh; compact
Check digitOptional modulo 43Mandatory modulo 103
Start/stopAsterisk (*) delimitersCode-set dependent start patterns
GS1 standardsNot used for modern GS1 dataCarries GS1-128 with application identifiers
Typical usesInternal asset tags, older industrial systems, some military and automotive workflowsShipping labels, GS1-128 pallet tags, asset and serial tracking
Reader supportUniversalUniversal
The same text encoded as Code 128 and Code 39, showing that Code 39 needs about twice the width
Identical data, two symbols: Code 39 buys its simplicity with roughly double the label width.

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.

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