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
| Criterion | Code 128 | Code 39 |
|---|---|---|
| Character set | Full ASCII (subsets A/B/C) | Digits, A-Z uppercase, - . $ / + % space |
| Relative width | Narrowest linear option | Roughly 30% wider for the same data |
| Lowercase support | Yes | Only via non-standard extension |
| Check character | Modulo-103, mandatory | Modulo-43, optional |
| Self-checking | Yes, plus check character | Yes |
| Numeric density | Very high (subset C) | Low |
| Legacy scanner support | Excellent | Universal |
| GS1 variant | GS1-128 | None |
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.