Code 39 Generator
Code 39 Generator renders data with the Code 39 symbology, commonly used for alphanumeric identifiers. Its basic alphabet is limited compared with Code 128, and applications differ on optional check digits, start/stop display, full-ASCII extensions, and required ratios. The page delegates accepted characters to bwip-js and does not configure an application-specific checksum.
Runs locally — files stay on your deviceWhen is Code 39 preferable to Code 128?
It can suit legacy or explicitly specified workflows, but Code 128 is generally denser and supports broader data.
Code 39 represents characters with wide and narrow bars
The core symbology supports uppercase letters, digits, space, and a limited punctuation set. Start and stop patterns frame the encoded data.
How it works
Enter a value. bwip-js configured as code39 validates supported characters and renders a PNG canvas with readable text.
Key concepts
Low density increases width
The same data can occupy more space than Code 128.
Application checksum rules vary
Some workflows require a Mod 43 check character, but this page does not expose that choice.
When to use it
- Create a label for an existing Code 39 workflow.
- Test legacy scanner compatibility.
- Encode a simple uppercase identifier.
When not to use it
- Do not assume lowercase or every ASCII character is supported in basic mode.
- Do not omit a required industry check digit.
- Do not choose Code 39 when label width is constrained without testing.
Worked examples
Asset label
- Input
ASSET-42- Expected output
Code 39 PNG
The characters belong to the basic alphabet.
Lowercase
- Input
asset-42- Expected output
May be rejected or transformed by encoder policy
Basic Code 39 is uppercase-oriented.
Long identifier
- Input
A very long supported string- Expected output
Wide symbol
Linear density limits matter.
Common mistakes
Ignoring the required alphabet
Unsupported characters cannot be represented in basic Code 39. Correction: Validate against the target specification.
Forgetting checksum policy
Scanner/application expectations can differ. Correction: Confirm whether Mod 43 is required.
Printing too narrow
Bars lose distinguishability. Correction: Use adequate x-dimension and quiet zones.
Best practices
- Follow the receiving system's symbology profile.
- Keep identifiers short and uppercase when possible.
- Verify printed labels end to end.
Related operations and differences
Code 128 Generator
Choose Code 128 Generator when you need to generate a downloadable Code 128 barcode.; use Code 39 Generator specifically for barcode code39.
EAN-13 Generator
Choose EAN-13 Generator when you need to generate an EAN-13 retail barcode.; use Code 39 Generator specifically for barcode code39.
EAN-8 Generator
Choose EAN-8 Generator when you need to generate a compact EAN-8 barcode.; use Code 39 Generator specifically for barcode code39.
UPC-A Generator
Choose UPC-A Generator when you need to generate a UPC-A product barcode.; use Code 39 Generator specifically for barcode code39.
Bitcoin Payment QR Code
Choose Bitcoin Payment QR Code when you need to create a Bitcoin payment URI QR code.; use Code 39 Generator specifically for barcode code39.
Contact vCard QR Code
Choose Contact vCard QR Code when you need to create a contact card QR code.; use Code 39 Generator specifically for barcode code39.
Limitations and privacy
- Basic bwip-js Code 39 configuration only.
- No exposed Mod 43 option, full-ASCII policy, application profile, or print verification.
- Accepted characters follow library behavior.
Generation happens locally in this browser. The PNG contains the entered payload, so share it with the same care as the underlying data.
Frequently asked questions
Does basic Code 39 support lowercase?
Not in its core alphabet.
Is a check digit always required?
It depends on the application.
Is it denser than Code 128?
Generally no.
Does this verify printed labels?
No.