Code 128 and Code 39 are popular linear barcode formats for internal operations. They are commonly used for inventory, warehouse labels, equipment, assets, files, and manufacturing workflows.
For most new systems, Code 128 is the stronger default because it encodes data more efficiently and supports a wider character set.
Code 39 remains useful when an established scanner, label specification, or legacy system requires it.
Quick comparison
| Feature | Code 128 | Code 39 |
|---|---|---|
| Letters | Yes | Yes |
| Numbers | Yes | Yes |
| Lowercase support | Yes | Usually no in standard Code 39 |
| Barcode density | High | Lower |
| Typical width | More compact | Wider |
| Common use | Logistics, inventory, shipping | Legacy systems, assets, industrial labels |
| Built-in symbol check character | Yes | Optional application check digit |
| Best default for new internal systems | Usually | Only when required |
What is Code 128?
Code 128 is a high-density linear barcode that can encode numbers, uppercase and lowercase letters, punctuation, and control characters.
It uses three character sets, known as Code Sets A, B, and C. The barcode can switch between them to represent data efficiently.
Code Set C encodes numeric digits in pairs, allowing long numeric values to fit into a relatively compact symbol. This makes Code 128 useful for:
- shipping references;
- carton and pallet labels;
- warehouse locations;
- serial numbers;
- batch references;
- internal product codes;
- order identifiers;
- asset labels.
Code 128 includes a mandatory calculated check character within the symbol to help detect scanning errors.
What is Code 39?
Code 39 is an older alphanumeric barcode format.
Standard Code 39 supports uppercase letters, numbers, spaces, and a limited group of symbols. It uses a start and stop character, conventionally represented by an asterisk in human-readable notation.
Code 39 is straightforward and widely supported, particularly in older industrial, automotive, defence, government, and asset-management systems.
Its main limitation is density. The same value generally produces a wider barcode than Code 128.
Which barcode is smaller?
Code 128 is usually more compact.
The difference becomes more noticeable with:
- long values;
- values containing mostly numbers;
- narrow asset tags;
- shelf-edge labels;
- small cartons;
- labels containing several fields.
Code 39 places more space around each encoded character, so the symbol grows quickly as data length increases.
A compact barcode is not automatically a better barcode. You still need sufficient bar width, height, contrast, and quiet zones for reliable scanning.
Which supports more characters?
Code 128 supports a broader set of characters, including lowercase letters and more punctuation.
Standard Code 39 supports:
A-Z
0-9
space
- . $ / + %
Some systems use an extended form of Code 39 to represent additional ASCII characters, but this depends on scanner configuration and can reduce interoperability.
Where lowercase letters or varied punctuation are required, Code 128 is generally the safer choice.
Which is easier to scan?
Both formats can scan reliably when generated and printed correctly.
Scan performance depends on:
- physical size;
- print quality;
- bar and background contrast;
- quiet zones;
- scanner capability;
- label material;
- distance and angle;
- data length.
Code 128’s density can make it suitable for limited spaces, but shrinking any barcode too far will reduce reliability.
Code 39 can be easier to implement in some legacy environments because it has long-standing scanner support and a simple character set.
Code 128 is not always GS1-128
This distinction is important.
GS1-128 uses the Code 128 symbology, but it follows additional GS1 rules. A GS1-128 symbol begins with a special FNC1 character and uses GS1 Application Identifiers to define data such as GTIN, batch number, serial number, or expiry date.
A standard Code 128 barcode containing ordinary text is not automatically a GS1-128 barcode.
Use GS1-128 only when your supply-chain specification requires it and your data is structured according to the applicable GS1 rules.
When to choose Code 128
Use Code 128 when:
- you are designing a new internal barcode system;
- the value contains lowercase letters or punctuation;
- label space is limited;
- you need compact numeric encoding;
- you are labelling cartons, stock, locations, or assets;
- your scanners and software support it;
- no external specification requires another format.
For many businesses, Code 128 is the best general-purpose barcode for internal workflows.
When to choose Code 39
Use Code 39 when:
- an existing system specifically requires it;
- you are integrating with a legacy application;
- an industry or customer specification names Code 39;
- your values use only its supported character set;
- label width is not a constraint;
- existing scanner configuration has been validated for Code 39.
Do not choose Code 39 solely because it appears simpler. Confirm that it fits the long-term data and label requirements.
Example
Suppose an asset reference is:
LAPTOP-DUB-00482
Both formats can encode the value.
Code 128 will normally produce a narrower symbol. Code 39 will be wider but may fit an established asset system that already expects Code 39.
If the reference becomes:
Laptop-DUB-00482/2026
standard Code 39 cannot represent the lowercase characters without modification. Code 128 can.
How to create the barcode
- Define a unique and stable internal identifier.
- Confirm which formats your scanner and software accept.
- Open the Free Barcode Generator.
- Select Code 128 or Code 39.
- Enter the value exactly as it should scan.
- Download the image.
- Print it at the intended size.
- Scan it into the actual destination system.
Do not test only by checking whether a phone app can read it. Test the barcode with the hardware and software used in the real workflow.
Final recommendation
For a new internal barcode system, choose Code 128 unless you have a clear reason not to.
Choose Code 39 where compatibility with an existing system or specification matters more than barcode density and character flexibility.
For retail product identification, neither format is a direct substitute for an EAN-13 or UPC-A symbol required by a retailer.