Comparison / Code 128 vs Code 39

Code 128 vs Code 39

Both are variable-length linear symbologies for internal use. Code 128 packs the same data into far less width; Code 39 is decoded by anything with a laser in it.

The short answer

For a new system, choose Code 128. The same SKU takes roughly a third less label width, lowercase letters and punctuation are supported, and a modulo-103 check character is built in.

Choose Code 39 when a standard, customer specification or an ageing scanner fleet requires it. Defence, automotive and some healthcare labelling guides still name it explicitly, and it is self-checking without any configuration.

The width difference is the deciding factor in practice. On a 50 mm label, a ten-character value in Code 39 often will not fit at a safe module width, while Code 128 has room to spare.

Side by side

CriterionCode 128Code 39
Character setFull ASCII (subsets A/B/C)Digits, A-Z uppercase, - . $ / + % space
Relative widthNarrowest linear optionRoughly 30% wider for the same data
Lowercase supportYesOnly via non-standard extension
Check characterModulo-103, mandatoryModulo-43, optional
Self-checkingYes, plus check characterYes
Numeric densityVery high (subset C)Low
Legacy scanner supportExcellentUniversal
GS1 variantGS1-128None

Choose Code 128 when

  • You want the shortest possible label
  • Your values include lowercase or punctuation
  • You need GS1 application identifiers via GS1-128

Choose Code 39 when

  • A standard or customer spec names Code 39
  • You are matching existing labels in a legacy system
  • Your data is short and uppercase alphanumeric only

Generate either format

Need hundreds of codes at once?

Upload a CSV and get every barcode or QR code back in one download — plus editable dynamic QR codes with scan analytics, and an API for programmatic generation.

Code 128 vs Code 39 questions

More comparisons