# Code 93

> Source: https://docs.barcoder.ai/docs/standards/code-93
> research date 2026-05-29 · extracted at 2026-10-06
> Publisher: Barcoder — encyclopedia of QR, barcode and payment-code standards

Specifications:
- [Code 93 — Wikipedia](https://en.wikipedia.org/wiki/Code_93)

## 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](https://docs.barcoder.ai/docs/standards/code-39)** <sup>[1][1], [2][2]</sup>. 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** <sup>[1][1]</sup> 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](https://docs.barcoder.ai/docs/standards/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** <sup>[1][1], [2][2], [3][3]</sup>: David Allais — already the inventor of [ITF](https://docs.barcoder.ai/docs/standards/itf) (1972), [Code 39](https://docs.barcoder.ai/docs/standards/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** <sup>[1][1], [3][3]</sup>:
- **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** <sup>[1][1], [code-128-ref]</sup>: Code 93 was published in 1982, **one year after Allais's [Code 128](https://docs.barcoder.ai/docs/standards/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** <sup>[1][1]</sup>: 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** <sup>[1][1], [4][4]</sup>:

| Parameter | Value |
|---|---|
| Symbology family | 1D linear |
| Character set (Native) | **43 characters**: A–Z, 0–9, space, `- . $ / + %` (same as [Code 39](https://docs.barcoder.ai/docs/standards/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** <sup>[1][1]</sup>:

| 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** <sup>[1][1]</sup>:
- **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** <sup>[1][1], [4][4]</sup>:
- 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** <sup>[1][1]</sup>:

- **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](https://docs.barcoder.ai/docs/standards/code-39) LOGMARS).
- **Postal sorting (other countries)** — occasional use in postal systems besides Canada Post.

**Why Code 93 is rarely chosen for new applications** <sup>[1][1]</sup>:
- [Code 128](https://docs.barcoder.ai/docs/standards/code-128) is denser, ASCII-capable natively, continuous, and equally well-supported by scanners.
- For numeric-only data, [ITF](https://docs.barcoder.ai/docs/standards/itf) is denser.
- For alphanumeric legacy compatibility, [Code 39](https://docs.barcoder.ai/docs/standards/code-39) has larger installed base.
- 2D successors ([Data Matrix](https://docs.barcoder.ai/docs/standards/data-matrix), [QR Code](https://docs.barcoder.ai/docs/standards/qr-code)) carry much more data in smaller footprints.

**Where Code 93 still wins** <sup>[1][1]</sup>:
- **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](https://docs.barcoder.ai/docs/standards/code-39) / [Code 128](https://docs.barcoder.ai/docs/standards/code-128) <sup>[5][5]</sup>:

- **Java + many ports** — [zxing/zxing][5] — 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.
- **Python** — `python-barcode`, `treepoem`, `pyzbar` all support Code 93.
- **PHP** — `picqer/php-barcode-generator`.
- **JavaScript** — `JsBarcode`, `bwip-js`.
- **C# / .NET** — `ZXing.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](https://docs.barcoder.ai/docs/standards/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](https://docs.barcoder.ai/docs/standards/code-128) (one year earlier) was more attractive for new applications [[code-39-ref]].

**vs. [Code 128](https://docs.barcoder.ai/docs/standards/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](https://docs.barcoder.ai/docs/standards/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](https://docs.barcoder.ai/docs/standards/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"** <sup>[1][1]</sup>. By every objective metric (density, error detection, character set) Code 93 is better than [Code 39](https://docs.barcoder.ai/docs/standards/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](https://docs.barcoder.ai/docs/standards/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** <sup>[2][2]</sup>:
- [ITF](https://docs.barcoder.ai/docs/standards/itf) (1972) — numeric high-density 1D
- [Code 39](https://docs.barcoder.ai/docs/standards/code-39) (1974) — first alphanumeric 1D
- Code 11 (1977) — telecom application
- [Code 128](https://docs.barcoder.ai/docs/standards/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** <sup>[1][1]</sup>. 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** <sup>[1][1]</sup> 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** <sup>[1][1]</sup>. 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** <sup>[1][1]</sup>:

- **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](https://docs.barcoder.ai/docs/standards/code-128) for alphanumeric, [ITF](https://docs.barcoder.ai/docs/standards/itf) for numeric shipping, or 2D successors ([Data Matrix](https://docs.barcoder.ai/docs/standards/data-matrix), [QR Code](https://docs.barcoder.ai/docs/standards/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]: https://en.wikipedia.org/wiki/Code_93
[2]: https://en.wikipedia.org/wiki/David_Allais
[3]: https://a2btracking.com/about-us/history-of-barcode/
[4]: https://barcodeguide.seagullscientific.com/content/Symbologies/Code_93.htm
[5]: https://github.com/zxing/zxing
[6]: https://en-academic.com/dic.nsf/enwiki/412468
[7]: https://cmbdn.cognex.com/barcode-scanner-sdk/code-93
[8]: https://developer.zebra.com/barcode-symbology-definitions
[code-39-ref]: https://docs.barcoder.ai/source/standards/code-39
[code-128-ref]: https://docs.barcoder.ai/source/standards/code-128
[itf-ref]: https://docs.barcoder.ai/source/standards/itf
[codabar-ref]: https://docs.barcoder.ai/source/standards/codabar

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

## Deployments

_No country reports mention this standard by name._

## Regions / aggregations not mapped to a single country

- Universal
