RunTheTests
/

Code 39 Generator

Generate a Code 39 barcode — the symbology every scanner reads without configuration.

Result

PASS

Code 128 ready to print

Each module prints at 0.266 mm, comfortably inside what a scanner reads. The bars are drawn as vector shapes, so they print at your printer's own resolution rather than being resampled from a bitmap — which is what keeps the module widths exact. Leave the white space either side of the bars clear: a border or a price sticker touching the quiet zone is the most common reason a correctly generated barcode will not scan.

Diagnostic telemetry
Encodes
SKU-00184-A
Symbology
Code 39
Check characterOptional in Code 39 and off by default — a scanner not expecting one reports it as trailing data
0
Width in modulesIncluding a 10-module quiet zone each side
188
Printed module widthBelow 0.19 mm, scanners and ordinary printers start to fail
0.266 mm

What this cannot tell you

  • Code 39 encodes only 43 characters: digits, A–Z, space and - . $ / + %. Lowercase is converted to uppercase; anything else cannot be represented.
  • It is far less dense than Code 128 — roughly twice the width for the same data — which is the cost of being readable by almost every scanner ever built without configuration.
  • The modulo-43 check character is optional and is off by default. A scanner not configured to expect one reports it as a trailing character in the data, which is silent corruption rather than a read failure.
  • Everything is rendered in your browser. Nothing is uploaded and no design is stored.

Take this with you

How this test page works

Each character is nine elements — five bars and four spaces — of which exactly three are wide, which is where the name comes from. Start and stop are both an asterisk, and every character is separated by a narrow space including before the stop, which is the separator encoders most often omit. Code 39 needs no check digit and encodes only 43 characters, and it persists across logistics, defence and asset tagging for one reason: almost every scanner ever built reads it out of the box without being told what symbology to expect. The optional check character is left off by default here, because a scanner not configured to expect one appends it to the data silently.

What the results mean

Nine elements
Five bars and four spaces per character, three of them wide. The property the name describes.
Start and stop
Both an asterisk, which is why an asterisk cannot appear in the data.
Check character
Optional, modulo 43, off by default — a scanner not expecting it reports it as data.
Density
About half that of Code 128 for the same content. That is the trade for universal readability.

Common problems and fixes

My text is rejected
Code 39 covers digits, A–Z, space and - . $ / + % only. Lowercase is upcased automatically; other punctuation cannot be encoded — use Code 128 instead.
The barcode is very wide
That is Code 39. It needs roughly twice the width of Code 128 for the same data, which is the price of needing no scanner configuration.
A stray character appears when scanned
The check character, with a scanner not configured to expect one. Turn it off, or configure the scanner to strip it.

Frequently asked questions

When should I use Code 39 over Code 128?

When you do not control the scanners. Code 39 is read by essentially everything without configuration, which is why asset tags and defence logistics still specify it despite being much less dense.

Does Code 39 need a check digit?

No, and that is part of its appeal. One is defined and optional, but adding it to a scanner that is not expecting one corrupts the data silently rather than failing.

Why can I not use an asterisk in the data?

Because it is the start and stop character. An asterisk in the middle would terminate the symbol early.

More in Label