Code 128 vs Code 93: Choosing the Right Alphanumeric Barcode

Compare Code 128 and Code 93 barcodes in density, character sets, error checking, and industry use. Learn which alphanumeric barcode format fits your application.

Code 128 and Code 93 are both linear barcode formats that encode alphanumeric data. Both handle the full ASCII character set. Both were developed as improvements over Code 39. But they took different approaches to the same problem — and the market chose one over the other. Code 128 became the global standard for shipping, logistics, and supply chain barcodes. Code 93 found a niche in Canadian postal services and a few specialized applications. Here's why, and whether Code 93 might still be the right choice for your use case.

Quick Comparison

FeatureCode 128Code 93
Year introduced19811982
Character setFull ASCII (128 characters, native)43 base + full ASCII via shift characters
Encoding3 bars, 3 spaces (11 modules per character)3 bars, 3 spaces (9 modules per character)
Check characters1 mandatory (modulo 103)2 mandatory (modulo 47)
Self-checkingNoNo
Numeric modeDouble-density (Code C subset)Same density as alpha
LowercaseNative (Code B subset)Extended mode only (doubled length)
GS1 variantGS1-128None
Industry adoptionUniversalNiche (Canada Post, some libraries)
Scanner defaultEnabled on all scannersOften needs manual activation

Density: A Nuanced Comparison

At first glance, Code 93 looks denser: each character uses 9 modules versus Code 128's 11. But real-world density depends on the data:

Alphanumeric Data (A-Z, 0-9)

Code 93 wins by about 15%. A 10-character alphanumeric string produces:

  • Code 93: approximately 120 modules total
  • Code 128: approximately 140 modules total

This makes Code 93 the more compact choice for uppercase alphanumeric data with no special characters.

Numeric-Only Data

Code 128 wins decisively. Its Code C subset encodes two digits per symbol character, effectively halving the barcode width for numeric strings:

  • Code 93: 10 digits = 10 characters = ~110 modules
  • Code 128 (Code C): 10 digits = 5 characters = ~75 modules

For numeric data (serial numbers, phone numbers, dates), Code 128 produces barcodes 30-40% narrower than Code 93.

Mixed Data with Lowercase

Code 128 wins. Its Code B subset encodes lowercase letters natively — one symbol character per lowercase letter. Code 93's Extended mode pairs two characters for each lowercase letter, doubling the barcode width for those characters.

A string like Order-abc123:

  • Code 128: Encodes directly using Code B for lowercase, Code C for the numeric run
  • Code 93: Extended mode doubles the width for a, b, and c

Bottom Line on Density

Code 93 is narrower for pure uppercase alphanumeric data. Code 128 is narrower for numeric data and any data with lowercase characters. Since most modern applications use mixed case or numeric data, Code 128's density advantage is more common in practice.

Error Detection: Code 93's Advantage

This is where Code 93 has a genuine technical advantage:

Code 128: One Check Character

Code 128 uses a single modulo 103 check character. This detects:

  • Single character substitution errors
  • Most transposition errors
  • Most insertion/deletion errors

One check character provides good but not infallible protection.

Code 93: Two Check Characters

Code 93 uses two independent check characters (modulo 47 each), calculated differently:

  • Check C: Weighted sum from right to left, weights cycling 1-20
  • Check K: Weighted sum from right to left (including Check C), weights cycling 1-15

Two independent check characters provide significantly stronger error detection:

  • Catches virtually all single and double substitution errors
  • Catches all transposition errors
  • Catches most insertion and deletion errors

Does This Matter in Practice?

For most applications, one check character (Code 128) is sufficient. Modern print quality and scanner technology make barcode errors extremely rare. The extra protection of Code 93's dual check characters matters in high-reliability environments — which is why postal services value it. Mail sorting systems process millions of barcodes daily at high speed, and even a tiny error rate is significant at that volume.

Character Encoding Approaches

Code 128's Three Subsets

Code 128 uses three switchable code subsets:

  • Code A: Uppercase, digits, control characters (ASCII 0-95)
  • Code B: Uppercase, lowercase, digits, symbols (ASCII 32-127)
  • Code C: Numeric pairs (00-99, two digits per symbol)

The encoder switches between subsets automatically to minimize barcode width. This is transparent — you enter the data and the generator handles subset optimization.

Code 93's Single Encoding + Shift Characters

Code 93 encodes 43 characters natively (same as Code 39): A-Z, 0-9, space, and seven special characters (- . $ / + % and an unmarked delimiter).

For the remaining ASCII characters (lowercase, additional symbols, control characters), Code 93 uses four shift characters. Each shift character is a full symbol-width prefix, so every extended character occupies two symbol positions in the barcode.

Practical Implications

If your data is uppercase alphanumeric only, both formats work equally well. The moment you need lowercase letters, special symbols, or control characters, Code 128 handles them with no width penalty while Code 93 doubles in width for each extended character.

Industry Adoption

Code 128 Is Everywhere

  • GS1-128 — the global supply chain standard — is built on Code 128. This alone makes Code 128 the default for logistics, shipping, and retail supply chains
  • FedEx, UPS, USPS, DHL — all use Code 128 for shipping label barcodes
  • ISBT 128 — blood banking standard
  • Inventory and warehouse systems — Code 128 is the standard for inventory barcodes
  • Library and document management — many systems default to Code 128

Code 93's Limited Adoption

  • Canada Post — the primary adopter, using Code 93 for postal code encoding on mail pieces
  • Some library systems — for internal circulation barcodes
  • Legacy installations — systems deployed when Code 93 was being actively promoted

The adoption gap is self-reinforcing: because Code 128 is everywhere, new systems choose Code 128, which makes Code 128 even more universal. Unless you're interfacing with Canada Post or a system that specifically requires Code 93, Code 128 is the practical choice.

Scanner Compatibility

Both formats are supported by modern barcode scanners, but with a practical difference:

Code 128 is enabled by default on virtually every barcode scanner. Plug in the scanner and it reads Code 128 immediately.

Code 93 may need to be enabled manually in scanner configuration. Many scanners ship with Code 93 disabled because of its limited use. If you deploy Code 93 barcodes, verify that every scanner in your workflow has Code 93 enabled — including barcode scanner apps and web-based scanners used for troubleshooting.

Decision Guide

Choose Code 128 When:

  • Starting a new system — Code 128 is the default choice for new implementations
  • Supply chain or logisticsGS1-128 is the standard, and it's built on Code 128
  • Mixed or numeric data — Code 128's Code C subset provides double-density numeric encoding
  • Lowercase characters needed — Code 128 handles them natively
  • Broad scanner compatibility — Code 128 works on every scanner without configuration
  • Interoperability — partners, carriers, and vendors all expect Code 128

Choose Code 93 When:

  • Canada Post compliance — Canada Post requires Code 93 for postal barcodes
  • Your existing system uses it — switching costs may exceed benefits
  • Uppercase alphanumeric data with maximum density — Code 93 is ~15% narrower for pure uppercase text
  • Maximum error detection is critical — dual check characters provide stronger protection than Code 128's single check

Migrating from Code 93 to Code 128

If you're on Code 93 and considering a switch:

  • All modern scanners support both formats simultaneously — you can migrate gradually
  • Data content doesn't change — the same text encodes in both formats
  • Print the same data as both Code 93 and Code 128, scan both to verify identical output
  • The main work is updating label templates and barcode generation software

Generating Barcodes

Create barcodes in either format with our free generators:

Both generators handle check character calculation automatically. Download as SVG, PNG, or PDF.

8 min read

Frequently Asked Questions

Which is more compact, Code 128 or Code 93?
Code 93 is slightly more compact for alphanumeric data — about 15% narrower than Code 128 for the same string. However, Code 128 is more compact for numeric-only data thanks to its double-density Code C subset. For mixed data typical of most applications, the density difference is marginal.
Is Code 93 better than Code 128?
Not in general. Code 128 is the industry standard with broader adoption, GS1 support (GS1-128), and better numeric encoding. Code 93 has a slight density advantage for alphanumeric data and mandatory error checking via two check characters. For new systems, Code 128 is the safer choice.
Can all scanners read Code 93?
Most modern barcode scanners support Code 93, but it's not universally enabled by default. Some scanners need Code 93 to be activated in their configuration. Code 128 is enabled by default on virtually every scanner. If you're using Code 93, verify scanner compatibility before deployment.
Where is Code 93 actually used?
Code 93 is used primarily by Canada Post for mail sorting and in some specific logistics and library systems. Outside of postal applications, Code 93 adoption is limited compared to Code 128. If you don't have a specific requirement for Code 93, use Code 128.
Can Code 93 encode lowercase letters?
Yes, through its Extended Code 93 mode, which uses shift characters to access the full ASCII set. But this doubles the barcode length for each extended character. Code 128 encodes lowercase letters natively through its Code B subset with no length penalty.