Skip to content
barcoder

Standards/code-93

Code 93

Type1D Linear
Completeness91%high

Overview

Code 93 is a 1D alphanumeric linear barcode symbology developed by David Allais at Intermec in 1982 as a direct improvement over his earlier code-39 [1, 2]. The design priorities: higher data density (Code 93 averages ~9 modules per character vs Code 39's ~13.7) and mandatory dual check characters (vs Code 39's optional single check). The name "93" reflects the structural rule: every Code 93 character is 9 modules wide and contains exactly 3 bars + 3 spaces.

Code 93 is primarily used by Canada Post for supplementary delivery information [1] and in select industrial / library contexts where Code 39's density limit is constraining. Despite being technically superior to Code 39 in density and built-in error detection, Code 93 never displaced Code 39 from its installed base because code-128 (also Allais-influenced, 1981, the year before Code 93) offered even better density and full ASCII support. Code 93 sits in a small niche between Code 39 (legacy alphanumeric) and Code 128 (modern alphanumeric).

History

1982 — David Allais invents Code 93 at Intermec [1, 2, 3]: David Allais — already the inventor of itf (1972), code-39 (1974), and Code 11 (1977) — designed Code 93 as a direct improvement over Code 39. The motivating problems:

  • Code 39's low data density — required wide labels for long alphanumeric strings.
  • Code 39's lack of mandatory check character — meant misreads were possible without explicit check-digit handling.

Design choices [1, 3]:

  • 9 modules per character (vs Code 39's 13–16) — ~30 % density improvement.
  • 3 bars + 3 spaces per character — strict structural rule giving Code 93 its name.
  • Variable bar/space widths (1–4 modules each) — vs Code 39's only-two-widths (narrow / wide). This is the source of Code 93's density gain.
  • Mandatory two check characters — modulo-47 "C" and "K" check characters appended to every symbol. No silent misreads.
  • Same 43-character set as Code 39 (A–Z, 0–9, 7 symbols) plus 5 special characters for Full-ASCII shift sequences.

The "code 128 competition" context [1, code-128-ref]: Code 93 was published in 1982, one year after Allais's code-128 (1981). Code 128 offered:

  • Full ASCII (128 characters native, not via shift sequences).
  • Even higher density via three subsets.
  • Continuous (vs Code 93's discrete) encoding.

This is the structural reason Code 93 never broke out of niche use — Code 128 was simultaneously available, more capable, and more flexible. New applications choosing a modern alphanumeric 1D symbology in 1982+ generally chose Code 128.

Canada Post adoption [1]: Canada Post adopted Code 93 for supplementary delivery information on mail pieces — a structural niche where Code 93's specific density-vs-character-set profile matched the requirement. Canada Post's installed base is the most prominent ongoing Code 93 deployment.

Technical specification

Code 93 is a discrete alphanumeric 1D linear symbology with mandatory dual check characters [1, 4]:

Parameter Value
Symbology family 1D linear
Character set (Native) 43 characters: A–Z, 0–9, space, - . $ / + % (same as code-39)
Character set (Full ASCII) 128 ASCII characters via 4 special-character shift sequences
Special shift characters 5 — start, stop, and 3 shift characters for Full-ASCII mode
Elements per character 9 modules — 3 bars + 3 spaces
Bar/space widths 1 to 4 modules (4 width values)
Length Variable
Mandatory check characters 2 — modulo-47 "C" and "K" check characters at end
Bidirectional reading Yes
Quiet zone 10 × narrow-element width on each side
Encoding mode Discrete (each character independent)
Start/Stop character Same character (denoted *) on both ends

Density comparison [1]:

Symbology Modules per character (avg) Relative to Code 39
Code 39 (regular) ~13.7 1.0× (baseline)
Code 93 ~9.0 ~0.65× (35 % denser)
Code 128 (Subset C numeric) ~5.5 ~0.4× (60 % denser for numeric)

Self-checking + check characters [1]:

  • Self-checking (per-character): every Code 93 character has exactly 3 bars and 3 spaces. Any defect changing this count flags an invalid character.
  • Modulo-47 dual check (per-symbol): two check characters at the end (C, K) provide additional symbol-level integrity. The C check uses weighted modulo-47 of all data + special characters; the K check uses weighted modulo-47 of all characters including the C check.
  • Combined effect: silent misreads are extremely rare at both character and symbol levels.

Full-ASCII Code 93 [1, 4]:

  • 4 special shift characters ($, %, /, +) combine with letter characters to encode the full 128-character ASCII set beyond Code 93's native 43.
  • Example: +a encodes lowercase "a"; /A encodes control character.

Use cases

Code 93's deployment is narrow and niche [1]:

  • Canada Post supplementary delivery information — Code 93's most prominent ongoing use. Canada Post uses it on mail labels for supplementary routing data beyond the primary postal-code barcode.
  • Library catalogue legacy systems — some 1980s-era library systems chose Code 93 over Code 39 for density; many have not migrated.
  • Healthcare / medical device legacy — small population of healthcare systems using Code 93 for asset tracking from 1980s deployments.
  • Industrial inventory legacy — niche manufacturing-floor deployments.
  • Aerospace legacy — some defense contractor systems use Code 93 for parts identification (alongside code-39 LOGMARS).
  • Postal sorting (other countries) — occasional use in postal systems besides Canada Post.

Why Code 93 is rarely chosen for new applications [1]:

  • code-128 is denser, ASCII-capable natively, continuous, and equally well-supported by scanners.
  • For numeric-only data, itf is denser.
  • For alphanumeric legacy compatibility, code-39 has larger installed base.
  • 2D successors (data-matrix, qr-code) carry much more data in smaller footprints.

Where Code 93 still wins [1]:

  • When density matters more than full ASCII and Code 39 isn't dense enough but Code 128's overhead isn't justified.
  • When mandatory dual-check robustness is required at the symbol level — Code 93's two-check-character design provides stronger integrity than Code 39's optional single check.

Implementations

Code 93 has universal scanner support but is less prominently featured in barcode-generation libraries than code-39 / code-128 [5]:

  • Java + many portszxing/zxing — 34 000★, active 2025. Decodes Code 93 alongside other 1D and 2D symbologies.
  • C / C++libzint (Zint barcode generator) supports Code 93 generation; zbar (decoder) supports Code 93.
  • Pythonpython-barcode, treepoem, pyzbar all support Code 93.
  • PHPpicqer/php-barcode-generator.
  • JavaScriptJsBarcode, bwip-js.
  • C# / .NETZXing.Net, Aspose.BarCode, Dynamsoft Barcode Reader (commercial).
  • OS-level mobile — iOS AVFoundation and Android CameraX / ML Kit decode Code 93.
  • POS / industrial scanners — every commercial 1D scanner (NCR, Datalogic, Honeywell, Symbol/Zebra, Cognex, Diebold) reads Code 93. Universal hardware support.
  • Thermal printers — Zebra, Honeywell, SATO, TSC all support Code 93 from their command languages.

Note on library prominence: Code 93 support is always present in commercial barcode libraries (because of installed-base obligations) but is rarely the default choice for new application examples — Code 128 and Code 39 dominate the example documentation.

Comparison

vs. code-39 — Code 93 is the direct intended successor. Both designed by David Allais (Code 39 in 1974; Code 93 in 1982). Improvements in Code 93:

  • ~35 % denser (9 vs ~13.7 modules per character)
  • Mandatory dual check characters (vs Code 39's optional single check)
  • Same 43-character native set; same Full-ASCII shift mechanism

But: Code 93 never displaced Code 39 because Code 39's installed base (DoD LOGMARS, automotive, library) was already entrenched by 1982, and code-128 (one year earlier) was more attractive for new applications [code-39-ref].

vs. code-128 — Direct competitor; Code 128 won the market because:

  • Code 128 has full ASCII natively (not via shift sequences).
  • Code 128's three subsets (A, B, C) provide flexibility for mixed content.
  • Code 128's Subset C two-digits-per-codeword encoding is denser than Code 93 for numeric data.
  • Code 128 is continuous (no inter-character gaps) — slightly denser printing.

Both designed in the same era (Code 128: 1981; Code 93: 1982). Both had Allais involvement. The structural choice favoured Code 128 for nearly all new applications [code-128-ref].

vs. itf — Both 1D, both Allais inventions. ITF is numeric-only, denser-for-numeric; Code 93 is alphanumeric, lower-density. Different niches: ITF for shipping cartons (numeric GTINs); Code 93 for occasional alphanumeric postal supplementary [itf-ref].

vs. codabar — Both 1D, both 1970s-era survivors. Codabar (1972) is numeric + 6 symbols only, self-checking, with letter start/stop; Code 93 (1982) is alphanumeric, mandatory dual-check. Different niches: Codabar for blood banks and libraries; Code 93 for postal supplementary [codabar-ref].

Fun facts

Code 93 is the rare case of "technically superior successor that never displaced the predecessor" [1]. By every objective metric (density, error detection, character set) Code 93 is better than code-39 — yet Code 39's installed base in DoD LOGMARS, automotive, and library systems was already established by 1982, and migration costs prevented wholesale replacement. Allais's later code-128 (1981, one year before Code 93) further blocked Code 93's adoption by being even more capable for new applications.

David Allais designed Code 93 as part of his sustained 1970s–80s effort to improve barcode density and capability [2]:

  • itf (1972) — numeric high-density 1D
  • code-39 (1974) — first alphanumeric 1D
  • Code 11 (1977) — telecom application
  • code-128 (1981) — full ASCII high-density 1D
  • Code 93 (1982) — improved Code 39
  • Code 49 (1987) — early 2D / stacked-linear

The Allais decade — 1972–1987 — produced the foundational 1D barcode taxonomy still in use 50 years later.

"9 modules wide × 3 bars × 3 spaces" — Code 93's structural rule encoded in the name [1]. The name is self-describing: every character uses 9 modules, comprises exactly 3 bars + 3 spaces. The 4 possible widths per element (1–4 modules) generate the encoding alphabet. This is more structural information embedded in a name than most barcode standards manage.

Mandatory dual check characters [1] is structurally significant: Code 39 has optional check; Code 128 has mandatory single check; Code 93 has mandatory two check characters (C and K). The double check is overkill for most applications but provides extremely strong integrity for high-criticality contexts where Code 93 has been chosen.

Canada Post's adoption is one of the few high-volume Code 93 deployments in operational use today [1]. Canada Post processes hundreds of millions of mail pieces annually, many with Code 93 supplementary-delivery barcodes. This single national-postal-service deployment is structurally important to Code 93's continued relevance in 2026 — without Canada Post, Code 93 would be near-extinct as an actively-printed symbology.

Status

Active but niche; slowly fading from new applications [1]:

  • No formal deprecation by AIM / ISO; standard remains maintained.
  • Universal scanner support continues — every 1D scanner reads Code 93.
  • Public domain — no licensing fees.
  • Canada Post is the most prominent ongoing high-volume deployment.

Strategic context:

  • New applications overwhelmingly choose code-128 for alphanumeric, itf for numeric shipping, or 2D successors (data-matrix, qr-code) for richer payloads.
  • Legacy install base of Code 93 deployments continues to function; no migration pressure beyond eventual hardware refresh.
  • The structural pattern: Code 93 is a technically-superior-but-never-mainstream symbology that survives by virtue of small installed bases and continued ISO maintenance.

Sources

  1. Code 93 — Wikipedia
  2. David Allais — Wikipedia
  3. History of Barcode Technology — A2B Tracking
  4. Code 93 — Seagull Scientific BarTender
  5. zxing/zxing — GitHub
  6. Code 93 — Academic
  7. Code 93 — Cognex Mobile SDK
  8. Barcode Symbology Definitions — Zebra

Deployments

No country reports mention this standard by name.

Regions / aggregations not mapped to a single country

  • Universal
source · docs/standards/code-93/index.md