Skip to content
Comparison5 min read

Code 128 vs Code 39: Which Barcode for Business Labels?

Compare Code 128 and Code 39 for inventory, asset tracking, and logistics labels. Learn when each format is the better choice.

Code 128 and Code 39 are the two most widely used 1D barcodes for internal business applications — inventory labels, asset tags, warehouse bin labels, and similar uses. Both are supported by virtually every barcode scanner. The choice between them usually comes down to the data you need to encode and the length of the barcode you can fit on your label.

Side-by-Side Comparison

FeatureCode 128Code 39
Character setFull ASCII (a–z, A–Z, 0–9, symbols)A–Z, 0–9, space, - . $ / + %
Lowercase supportYesNo (uppercase only)
Barcode densityHigh (compact bars)Lower (wider bars)
Check digitAutomatic (mandatory)Optional (not usually included)
Max practical length80 chars50 chars
Scanner compatibilityAll modern scannersAll modern scanners
Best useGeneral business, logistics, inventoryLegacy systems, simple asset tags

Code 128: The Modern General-Purpose Choice

Code 128 was introduced in 1981 and has become the most widely used 1D barcode for business and logistics applications. It supports the complete ASCII character set — all 128 standard characters — which makes it far more flexible than Code 39.

Code 128 produces shorter barcodes than Code 39 for the same data because it encodes two digits per symbol when encoding numbers. This compact density is one of the main reasons Code 128 has largely replaced Code 39 in modern systems.

  • Use Code 128 when your data includes lowercase letters
  • Use Code 128 when your barcodes are long and you need a compact label
  • Use Code 128 for shipping labels, inventory management, and most modern warehousing systems
  • Use Code 128 for GS1-128 labels (the GS1 application identifier standard used in supply chains)

Code 39: The Legacy Standard

Code 39 was developed in 1974 and was one of the first alphanumeric barcodes. It is simple, self-checking, and does not require a check digit (though one can optionally be included). Its simplicity made it popular in early barcode systems.

Code 39 encodes only uppercase letters (A–Z), digits (0–9), a space, and six special characters (- . $ / + %). This limited character set means it cannot encode lowercase letters. For a barcode that needs to match, say, a serial number like "SN-2024-Batch01", Code 39 cannot represent the lowercase letters.

  • Use Code 39 when your data is uppercase letters and digits only
  • Use Code 39 for compatibility with legacy systems that only support Code 39
  • Use Code 39 for simple asset tags or equipment labels where space is not an issue
  • Use Code 39 in industries that have historically standardized on it (US military, automotive)

Which to Choose?

For any new system, Code 128 is the better default choice. It is more compact, supports more characters, and includes a mandatory check digit that helps catch scan errors. The only reason to choose Code 39 over Code 128 in a new system is compatibility with existing equipment that does not support Code 128 — which is rare in modern scanners.

Migrating from Code 39 to Code 128

Modern barcode scanners read both formats. If your scanner supports Code 128 (most do), you can switch new labels to Code 128 while your scanner continues to read old Code 39 labels during the transition.

Ready to create a barcode?

Free, browser-based, no signup required.

More articles