Home · Compare · Code 128 vs Code 39: Which Barcode Format Should You Use?

Code 128 vs Code 39: Which Barcode Format Should You Use?

Two industrial-strength 1D barcodes with similar use cases but very different capabilities. Here is the practical breakdown.

Code 128 and Code 39 are both variable-length 1D barcode symbologies used for non-retail applications: shipping labels, inventory tags, healthcare wristbands, asset tracking, and internal serial numbers. They are not used for retail product identification (that's UPC/EAN territory).

The short version: Code 128 is the modern default and almost always the right answer for new systems. Code 39 is the legacy option you'll still encounter in auto parts, defense, libraries, and older industrial systems that haven't been updated.

Bottom line

For any new project, use Code 128 — it's higher density, supports full ASCII (including lowercase letters and symbols), and has built-in checksums. Use Code 39 only if you're integrating with a legacy system that specifically requires it.

Code 128 vs Code 39: side-by-side

Code 128Code 39
Character setFull ASCII (128 characters, including lowercase and symbols)43 characters (uppercase A-Z, 0-9, and -. $/+%)
Data densityHigh — narrow bars and spaces, ~30% smaller for same dataLower — each character is 9 wide bars/spaces
ChecksumRequired (mod 103)Optional (mod 43)
Common usesShipping (UPS, FedEx, USPS), Amazon FNSKU, GS1-128 with AIs, healthcare wristbandsAuto parts catalogs, defense (DoD), libraries, photo lab tickets
Variable lengthYesYes
Scannable on smartphoneYes (every camera-based scanner)Yes (every camera-based scanner)
Year introduced19811974
GS1 standardizedYes (as GS1-128 with Application Identifiers)No

How to tell which one you're looking at

Visual cue: Code 39 always starts AND ends with an asterisk (*) printed in the human-readable text below the barcode. Code 128 doesn't. Also, Code 39 bars and spaces look more uniform and wider; Code 128 bars vary much more in width and look denser. If the human-readable text contains lowercase letters or special characters beyond `-. $/+%`, it's definitely Code 128 — Code 39 can't encode those.

Why Code 128 dominates modern systems

Three reasons. First, density: Code 128 encodes the same data in 30%+ less physical space, which matters on small shipping labels and unit-of-sale stickers. Second, character set: Code 128 handles lowercase letters, special characters, and the full ASCII range, while Code 39 is uppercase-only. Third, GS1 standardization: Code 128 is the foundation of GS1-128, which embeds Application Identifiers like (01) for GTIN, (10) for batch, (17) for expiry — the backbone of supply-chain traceability.

Where Code 39 still lives

Code 39 hangs on in auto parts catalogs (where every part number is an uppercase alphanumeric, fitting Code 39's character set), Department of Defense logistics (Code 39 is mandated by military specs), some library cataloging systems, and older industrial inventory setups built in the 1980s and 90s. If you're integrating with one of those systems, use Code 39. Otherwise, use Code 128.

FAQ

How can I tell if a barcode is Code 128 or Code 39?

Code 39 always shows asterisks (*) at the start and end of the human-readable text below the barcode. Code 128 doesn't have asterisks. Also: if you see lowercase letters or special characters (beyond -. $/+%), it must be Code 128 — Code 39 can't encode them.

What is the difference between Code 128 and Code 39?

Code 128 supports the full ASCII 128-character set and is much denser (smaller for same data). Code 39 supports only 43 characters (uppercase only) and produces wider, less-dense barcodes. Code 128 has a required checksum; Code 39's checksum is optional. Code 128 is the modern default; Code 39 lives mostly in legacy systems.

Is Code 39 still used today?

Yes, but mostly in legacy applications: auto parts catalogs, US Department of Defense logistics, some libraries, and older industrial inventory systems. For new projects, Code 128 is almost always the right choice.

Is Code 128 still widely used?

Code 128 is the dominant modern 1D barcode. It's used on UPS, FedEx, and USPS shipping labels, every Amazon FBA FNSKU label, GS1-128 supply-chain codes (with Application Identifiers for lot, expiry, serial), healthcare patient wristbands, and most modern asset-tracking deployments.

Is Code 128 better than Code 39?

For new applications, yes — Code 128 is more compact, supports more characters (including lowercase), and is required for GS1-128 supply-chain compliance. Code 39 is only 'better' when you're forced to integrate with a system that mandates it (some military and legacy industrial specs).

Related generators

Generate the right format now

Now that you know which one you need — render a valid barcode in seconds. No signup, no watermark, valid GS1 check digit. Free for casual use; paid plans from $9/mo.

Related comparisons