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.
| Property | Value | In context |
|---|---|---|
| Minimum X-dimension | 0.191 mm | 0.0075 in · 8 thou |
| Quiet zone | 10 modules | 1.91 mm at the minimum X-dimension |
| Dimensionality | Linear (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.
| Resolution | Narrow bar in dots | Printed as | Rounding error |
|---|---|---|---|
| 203 dpi | 1.53 | 2 dots | 31% |
| 300 dpi | 2.26 | 2 dots | 11% |
| 600 dpi | 4.51 | 5 dots | 11% |
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
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.