Home › Code 128 vs Code 39
Code 128 vs Code 39 — Technical Comparison & Decision Guide
Last updated: April 2026
Code 128 and Code 39 are both alphanumeric barcode formats used for internal applications — inventory labels, asset tags, shipping labels, and industrial identification — where no GS1 registration is required. The fundamental difference is density: Code 128 encodes the same data in roughly 30–40% less space than Code 39. For the majority of new implementations, Code 128 is the clear choice. Code 39 remains relevant only in specific industries and legacy environments that explicitly require it. This guide explains why, when each is appropriate, and how to decide for your specific application.
Direct Comparison Table
| Property | Code 128 | Code 39 |
|---|---|---|
| Character set | Full ASCII — all 128 characters including lowercase, symbols, and control characters | Uppercase A–Z, digits 0–9, and 7 symbols: space, $ / + % . - |
| Lowercase letters | Yes (natively) | No — requires Code 39 Extended variant |
| Numeric digits | Yes — Code 128C sub-type encodes digit pairs for maximum numeric density | Yes |
| Data density | High — approximately 2 characters per 3mm at standard narrow bar width | Low — approximately 1.6 characters per 5mm at standard narrow bar width |
| Barcode width for 10-character data | ~35–40mm at 0.25mm narrow bar | ~65–75mm at 0.25mm narrow bar |
| Self-checking | No — mandatory check character (mod 103) added automatically | Yes — the bar pattern structure inherently detects single-character errors |
| Check character | Mandatory, auto-calculated | Optional (usually omitted) |
| GS1 supply chain extension | Yes — GS1-128 uses Application Identifiers for structured supply chain data | No |
| Sub-types | 128A, 128B, 128C — auto-selected for optimal density | Standard and Extended (Full ASCII) variants |
| Primary industries | Logistics, e-commerce, healthcare, retail backroom, Amazon FBA (FNSKU) | Automotive (AIAG), US Defence (MIL-STD), legacy healthcare, government |
| Scanner compatibility | All modern scanners — universal support since ~1995 | All modern scanners — but some very old equipment reads Code 39 only |
The Density Difference — Why It Matters
The gap between Code 128 and Code 39 barcode widths is significant enough to affect what labels you can use. To encode the string ITEM-BLK-LG-001 (15 characters):
- Code 128 — approximately 45–50mm wide at standard narrow bar width (0.25mm) with a minimum recommended bar height of 25mm. Fits comfortably on a standard 1" × 3" label with room for human-readable text and a logo.
- Code 39 — approximately 85–95mm wide at the same narrow bar width. Requires a wide-format label (roughly 4–5 inches) or the bar height must be significantly reduced, which can cause scanning failures.
This is not a marginal difference. On small labels — shelf bin tags, pharmaceutical packaging, jewellery price tags, electronics component bags — Code 39 often cannot encode the data that Code 128 handles easily. This density gap is the primary reason Code 128 replaced Code 39 as the default choice in logistics, retail warehouse operations, and new system implementations starting in the late 1990s.
Code 128 Sub-Types: A, B, and C
Code 128 has three sub-types that are often selected automatically by the generator:
Code 128A encodes uppercase letters, digits, and ASCII control characters (such as carriage return and tab). It is used in applications that require control character encoding, which is rare in most commercial contexts.
Code 128B encodes the full ASCII character set including lowercase letters. It is the most commonly used sub-type and the default in most implementations. When you generate a Code 128 barcode with mixed-case or lowercase characters, Code 128B is used.
Code 128C encodes digit pairs with exceptional density — each pair of two digits (00–99) is encoded in a single barcode symbol. This halves the barcode width for purely numeric data compared to Code 128B. It is used for FNSKU codes, numeric serial numbers, and other all-numeric data where space is at a premium. BatchPrintGTIN automatically selects Code 128C for numeric-only input where appropriate.
When Code 39 Is Still Required
Despite Code 128's advantages, Code 39 remains a mandatory requirement in several specific industries and standards:
Automotive Industry — AIAG Standards
The US automotive industry standardised on Code 39 through the Automotive Industry Action Group (AIAG) in the 1980s. Vehicle identification number (VIN) labels, supplier delivery tags, and many parts identification labels in the automotive supply chain specify Code 39 explicitly. Major automakers and Tier 1 suppliers often have decades-old receiving equipment that only reads Code 39. If you are a supplier to Ford, GM, Stellantis, Toyota, or any of their tier suppliers in North America, check the relevant AIAG standard (particularly B-10 for shipping labels) before choosing a format. Many automotive applications are now migrating to QR and Data Matrix codes for parts tracking, but Code 39 remains the fallback requirement in many facilities.
US Department of Defense
Various US DoD standards — including MIL-STD-1189 and many individual programme specifications — require Code 39 for asset labels. Although the DoD has updated many specifications to allow Code 128 and 2D codes (particularly for UID — Unique Identification — applications which use Data Matrix), legacy facilities and older receiving systems throughout the defence supply chain still require Code 39. If you are supplying to a US government contract, check the specific contract and programme requirements.
Legacy Healthcare Systems
Some hospital systems, blood banks, and laboratory information systems installed before the mid-2000s support Code 39 only. Clinical environments have long hardware replacement cycles, and a scanner installed in a surgical supply room in 2003 may still be in active service. If you are integrating barcodes with an existing clinical system, scan test labels on the actual equipment before committing to Code 128.
Government and Identity Applications
Some state and federal government applications — including certain driving licence and identification document formats and correctional facilities — use Code 39 in legacy systems. Newer government ID applications generally use PDF417 or Data Matrix.
GS1-128 — When You Need Structured Supply Chain Data
GS1-128 (formerly called EAN-128 or UCC-128) is a specific application of Code 128 that uses GS1 Application Identifiers (AIs) to encode multiple structured data elements in a single barcode. Application Identifiers are two-to-four-digit prefixes that tell the scanner what type of data follows — for example, AI (01) indicates a GTIN, AI (17) indicates an expiry date, AI (10) indicates a batch or lot number, and AI (21) indicates a serial number.
A single GS1-128 barcode on a pharmaceutical package might encode all of the following: the product GTIN, the lot number, the expiry date, and the serial number. A retail distribution centre label might encode a GTIN, a serial shipping container code, and a delivery date. This structured encoding is impossible in plain Code 128 or Code 39 — those formats simply encode a string of characters with no standardised meaning assigned to specific positions.
GS1-128 is required in some healthcare supply chains (particularly in hospital and pharmacy systems implementing GS1 Healthcare standards), some food and fresh produce supply chains (for lot and expiry tracking), and on retailer-specific distribution centre labels for chains such as Walmart, Costco, and many European grocery retailers. If a retailer's supplier requirements document specifies "GS1-128 with Application Identifiers," this is the format they mean.
Real-World Use Case Summary
| Application | Recommended Format | Reason |
|---|---|---|
| Warehouse shelf and bin labels | Code 128 | High density, full alphanumeric, fits standard labels |
| Amazon FBA FNSKU labels | Code 128 (FNSKU preset) | Amazon's required format for FNSKU codes |
| FedEx / UPS / USPS shipping labels | Code 128 | Industry standard for parcel carriers |
| Asset tracking tags | Code 128 or Code 39 | Code 128 preferred; Code 39 if legacy readers in use |
| Automotive supplier labels | Code 39 | AIAG standard requirements |
| US military / government asset labels | Code 39 or Data Matrix | MIL-STD and DoD UID requirements |
| Pharmaceutical packaging | GS1-128 or Data Matrix | Lot/expiry encoding; EU FMD requires Data Matrix |
| Retail DC compliance labels | GS1-128 | Retailer routing and receiving specifications |
| Library books and media | Code 128 or Codabar | Modern systems use Code 128; some legacy use Codabar |
| Event tickets and wristbands | Code 128 or QR Code | Code 128 for gate scanners; QR for smartphone tickets |
Migrating from Code 39 to Code 128
If you are running a legacy internal system that uses Code 39 and want to switch to Code 128, the transition is straightforward as long as your scanners support Code 128 — which almost all scanners manufactured after 1995 do. The data encoded in the barcode does not change; you simply regenerate your labels with Code 128 instead of Code 39. The barcodes will be narrower (which may allow you to reduce label size or add more information), and scanning will be more reliable at longer read distances.
Before migrating, test a Code 128 barcode on every scanner in your operation, including mobile devices, fixed-mount scanners at receiving docks, and any integrated scanner in desktop software. If all scanners confirm successful reads, you can switch format on next print run without any data changes.
Frequently Asked Questions
Does Code 128 or Code 39 require GS1 registration?
Neither format requires GS1 registration for internal use. You can encode any data you choose — SKUs, serial numbers, asset numbers, order numbers, employee IDs — without registering with any standards body. GS1 registration is only required when your barcode encodes a GTIN that will be scanned at retail point of sale or submitted to a marketplace like Amazon or Walmart. For warehouse labels, asset tags, and internal inventory, Code 128 and Code 39 are completely free to use.
Can I encode lowercase letters in Code 39?
Standard Code 39 only supports uppercase letters, digits 0–9, and a limited set of special characters. To encode lowercase letters, you need Code 39 Extended (also called Code 39 Full ASCII), which pairs standard Code 39 characters to represent the full ASCII character set. Code 39 Extended barcodes are wider still than standard Code 39. If you need lowercase letters, Code 128B is a much more efficient choice — it natively supports full ASCII including lowercase at significantly higher density than Code 39 Extended.
What format does Amazon use for FNSKU labels?
Amazon encodes FNSKU codes (such as X001AB12CD) as Code 128 barcodes. Amazon's Seller Central label generator produces Code 128 output, and the FNSKU preset in BatchPrintGTIN generates the correct Code 128 format. FNSKU labels printed on Avery 5160 stock (1" × 2⅝", 30 per sheet) are the standard format for FBA unit labelling.
What is the difference between Code 128 and GS1-128?
GS1-128 is a subset of Code 128 that uses GS1 Application Identifiers to encode structured, standardised data elements — GTINs, lot numbers, expiry dates, serial numbers, weights, and more. Every GS1-128 barcode is a valid Code 128 barcode, but not every Code 128 barcode is a valid GS1-128. GS1-128 requires that the data be structured according to GS1's AI specification and that the barcode begin with the FNC1 function character. Use plain Code 128 for internal data where you define the format; use GS1-128 when a retailer, marketplace, or regulatory body requires structured supply chain data.
My scanner reads Code 39 but not Code 128. What should I do?
A scanner that reads Code 39 but not Code 128 is likely from the early 1990s or earlier, or is a very low-cost consumer scanner with limited symbology support. Most modern scanner firmware can be updated to enable Code 128 support — check the manufacturer's documentation for a programming barcode that enables Code 128 decoding. Alternatively, if your organisation is planning a scanner refresh, any current-generation scanner will read both formats and typically 20+ other symbologies.
Related Topics
- Code 128 Barcode Generator — All Character Sets and Options
- All Barcode Formats Compared — UPC, EAN, Code 128, QR & More
- Amazon FBA Barcode Guide — FNSKU Label Requirements
- Barcode Label Generator — Label Dimensions for Code 128
- Bulk Barcode Generator — Generate Code 128 from CSV
- Barcode Examples — Scannable Samples of All Formats
