Skip to content
PrintMyLabels

Linear symbology

Code 39

Code 39 is an older linear symbology encoding capital letters, digits and a handful of punctuation characters, still in use because a very large amount of installed equipment reads it. It is self-checking and easy to print, but noticeably wider than Code 128 for the same value.

Specification

These are the values the editor enforces while you design, not figures collected from elsewhere — the same numbers its quiet-zone and resolution checks run on.

Code 39 specification: minimum X-dimension, quiet zone and dimensionality
PropertyValueIn context
Minimum X-dimension0.191 mm0.0075 in · 8 thou
Quiet zone10 modules1.91 mm at the minimum X-dimension
DimensionalityLinear (1D)Read by laser or imager

Code 39 at 203, 300 and 600 dpi

A printer can only place whole dots, and 0.191 mm is not a whole number of them at any of these resolutions. What changes is how much a single dot of rounding costs you as a share of the narrow bar.

Code 39 narrow bar in printer dots at 203, 300 and 600 dpi
ResolutionNarrow bar in dotsPrinted asRounding error
203 dpi1.532 dots31%
300 dpi2.262 dots11%
600 dpi4.515 dots11%

What Code 39 encodes

Capital A to Z, digits 0 to 9, and the characters minus, full stop, dollar, slash, plus, percent and space. Lower case is not supported. Length is variable, and an asterisk is used as the start and stop character by the encoder.

Where it is used

  • Asset tags and internal inventory labels on established systems
  • Industrial and automotive environments with long-lived scanning equipment
  • Name badges and access cards where density is not a constraint

Check digit

Code 39 is self-checking, meaning a single misread character is unlikely to produce a valid substitute, and no check character is required. An optional modulo-43 check character exists and some specifications mandate it — if a trading partner asks for Code 39 with a mod-43 check, that is a requirement of their system rather than of the symbology.

How Code 39 fails in practice

  • Running out of label width. Code 39 uses nine elements per character and is roughly twice the width of Code 128 for the same data, which is the usual reason a value that fitted in testing does not fit in production.
  • Entering lower-case text, which the character set cannot represent at all.
  • Assuming the printed asterisks are part of the data. They are start and stop characters and are not part of your value.

When to use something else

  • Code 128 — choose it instead when you control the scanning equipment and want the same data in roughly half the width.
  • Codabar — choose it instead when an existing library or blood-bank system specifically expects it.

Questions about Code 39

Why is my Code 39 barcode so wide?
Code 39 spends nine elements on every character and cannot pair digits the way Code 128 does, so it is around twice as wide for the same value. If the symbol will not fit the label, the symbology is usually the thing to change.
Can Code 39 encode lower-case letters?
Not in its standard form. The character set is upper case only. An extended encoding exists that represents lower case using character pairs, but it doubles the width and needs a scanner configured to decode it.