Skip to content

Code 39 Barcode Generator for Badges, Parts and Assets

Create Code 39 (Code 3 of 9) barcodes, the self-checking format still required by many automotive, defense and access control systems.

  • 100% free
  • No sign-up
  • Never expires
  • No watermark
Loading generator…

How to use the Code 39 generator

  1. 1

    Type the value

    Enter upper-case letters, digits and the supported symbols. Lower-case input is flagged so you can correct it.

  2. 2

    Set the dimensions

    Code 39 is wide, so check the length against your label and lower the bar width if needed.

  3. 3

    Download and print

    Export vector SVG or PDF for badge templates, or PNG for documents and spreadsheets.

Features

  • Encodes A-Z, 0-9, space and - . $ / + %
  • Start and stop asterisks added automatically
  • Flags lower-case letters and unsupported characters as you type
  • SVG, PNG and PDF export for badges and labels
  • Free, with no watermark, account or upload

Where Code 39 is still used

Code 39 was developed in 1974 and became one of the first alphanumeric barcodes. Each character is made of nine elements (five bars and four spaces), three of which are wide, which is where the name "3 of 9" comes from. It is self-checking, so a single printing defect cannot turn one character into another.

It is less compact than Code 128, but it remains written into many standards, including the US Department of Defense LOGMARS standard and automotive industry AIAG labels. It is also common on employee ID badges, library cards and older asset management systems.

Code 39 vs Code 128

Code 39Code 128
Character set43 characters, upper case onlyAll 128 ASCII characters
DensityLow; wide barcodesHigh; about 30-40% shorter
ChecksumOptional (mod 43)Mandatory
Best forSystems that require itNew projects
Side-by-side Code 39 and Code 128 barcodes showing the width difference for identical data
Code 39 is easy to print and verify; the cost is about twice the width.

Practical tips

  • If your software does not specifically require Code 39, Code 128 will give you a shorter barcode.
  • The asterisk (*) is reserved as the start and stop character, so it cannot appear inside your data.
  • Keep at least 10 bar widths of quiet zone on each side, or a minimum of about 6 mm.
  • Test with your actual scanner. Some older devices need Code 39 enabled in their settings.

Why Code 39 needs more space

A Code 39 character occupies nine elements - five bars and four spaces - of which exactly three are printed wide and the rest narrow, followed by a narrow inter-character gap. Nothing is shared between characters, so a damaged area costs one character rather than the whole run. The price is length: because every character pays for its own spacing, the same value takes roughly twice the label width that Code 128 needs.

The plain alphabet is 43 characters plus the asterisk that frames the symbol. Lower-case letters only exist through Extended Code 39, which encodes them as pairs such as $A for a. A reader that is not configured for the extension hands back the pair, so test with the hardware that will actually be used.

PropertyValue
Elements per character5 bars + 4 spaces, three of them wide
Character set43 data characters, plus * as start and stop
Lower caseAvailable only as Extended Code 39 pairs
Check digitOptional, modulo 43
DensityAbout half that of Code 128 for the same text

Frequently Asked Questions

Why can Code 39 not encode lower-case letters?

The standard character set has only 43 characters. An "extended" Code 39 mode uses character pairs to represent full ASCII, but the scanner must be configured for it. For mixed case, Code 128 is a simpler choice.

Do I need to add asterisks to my value?

No. The generator adds the start and stop characters automatically. Enter only the data you want to encode.

Is a check digit required?

Not by the standard. Some industries require the optional modulo-43 check character. If yours does, calculate it and append it to the value.

Is the asterisk part of my data?

No. It marks the start and stop of the symbol, and readers normally strip it before the value reaches your application. If you see it in the scanned output, the delimiter setting on the scanner is the thing to change.