Skip to content
barcoder

Standards/code-39-extended

Code 39 Extended

Type1D Linear
Completeness74%high

Overview

Code 39 Extended, also called Full ASCII Code 39 (and Code 39e or Code39+), is a variant of Code 39 that encodes all 128 ASCII characters by pairing a shift character ($, %, / or +) with a regular Code 39 character 1510. The printed symbol is ordinary Code 39. Only the meaning of certain character pairs changes, so the reader has to be in Full ASCII mode to recover the intended text 23.

History

Code 39 itself was developed in 1974 by Dr. David Allais and Ray Stevens of Interface Mechanisms Inc. (Intermec) 12. It was standardised as ANSI MH 10.8 M-1983 and MIL-STD-1189. MIL-STD-1189 was later replaced by ANSI/AIM BC1/1995, Uniform Symbology Specification — Code 39, and the current standard is ISO/IEC 16388:2023 1. Seagull Scientific describes Full ASCII as "an extension of the original Code 39 symbology" 2. None of the fetched sources gives the year Full ASCII mode was introduced or who devised it. In 1982 Intermec designed Code 93 to improve on Code 39, and Code 93 includes its own full-ASCII scheme 9.

Technical specification

  • Base symbology: a discrete, variable-length 1D code. Each character has nine elements (five bars and four spaces), three wide and six narrow 2. Base Code 39 encodes 43 characters: 0-9, A-Z, -, ., space, $, /, + and % 110.
  • Shift pairs: each of the remaining ASCII characters is written as two Code 39 characters 16:
    • $ + A–Z gives control characters (for example $A = SOH) 16.
    • % + letter gives ESC through US, the punctuation [ \ ] ^ _ { | } ~, and NUL (%U), @ (%V), ` (%W) and DEL (%T, %X, %Y or %Z) 16.
    • / + A–O gives ! through ,, and /Z gives : 16.
    • + + A–Z gives lower-case a–z 126.
  • Characters that keep their single-character form: 0-9, A-Z, ., - and space look the same in Full ASCII as in plain Code 39 1. The four characters that act as shifts are themselves written as pairs when they appear as data: $ = /D, % = /E, + = /K and / = /O. The data character * is written as /J 1.
  • Capacity: zint caps Extended Code 39 at 86 symbol characters, counted after expansion into shift pairs 1012. Characters that need a pair take twice the space, so lower-case text makes a symbol about twice as long as the same text in upper case 211.
  • Check character: an optional modulo-43 check digit, the same as in plain Code 39 2510.
  • Decoding: a reader in Full ASCII mode reads a shift character and, instead of sending it, combines it with the next character 2. In ZXing, Code39Reader(usingCheckDigit, extendedMode) enables Full ASCII decoding. extendedMode is off by default, and an invalid pair or a shift at the end of the data throws a FormatException 6.

Use cases

  • Lower-case and control characters on Code 39 equipment: Full ASCII lets existing Code 39 printers and readers handle lower-case letters, punctuation and control codes 54. Report-design and barcode SDKs such as Genero Report Writer and DevExpress offer a dedicated "Code 39 Extended" type that generates the shift pairs automatically 45.
  • US military logistics: Seagull Scientific's Full ASCII entry notes heavy use of Code 39 variants in the US military as part of the LOGMARS system 2. Zint's LOGMARS variant, however, accepts only the standard Code 39 character set and up to 30 characters 10.
  • Industrial Code 39 deployments in general: Aspose lists Code 39 (with full-ASCII capability) in automotive and medical-equipment manufacturing, aircraft construction, healthcare, inventory, transportation, name badges and assembly tracking 11. These sources describe Code 39 as a whole. None of them identifies a deployment that requires Full ASCII specifically.

Implementations

  • zint (C, ~810 stars, active October 2026): an encoder exposed as BARCODE_EXCODE39 / -b EXCODE39, with the same check-digit options as standard Code 39 1012.
  • bwip-js (JavaScript, ~2.4k stars, active August 2026): an encoder with the code39ext symbology ID, which this site's playground uses 12.
  • ZXing (Java, ~34.1k stars, active September 2026): a decoder. Full ASCII is opt-in through the extendedMode constructor flag of Code39Reader 612.
  • python-barcode (Python, ~656 stars) converts Code 39 input to upper case, so it does not produce Full ASCII symbols 13.

Comparison

  • Versus plain Code 39: the bars are identical and only the interpretation differs. If a Full ASCII symbol is read in plain mode, the shift characters come through literally, for example as + signs between characters 7. A plain symbol read in Full ASCII mode can be misread if its data happens to contain a valid shift pair, and ZXing rejects incomplete pairs outright 6. Use plain Code 39 when the data fits in its 43 characters. Use Full ASCII only when lower-case letters or control characters are needed and every reader can be set to Full ASCII mode 37.
  • Versus Code 93: Code 93 also covers full ASCII, but it uses four dedicated shift symbols instead of reusing $, /, + and %. It always carries two modulo-47 check characters 9. Zint calls Code 93 "a variation of Extended Code 39" 10.
  • Versus Code 128: Code 128 encodes full ASCII natively. Code 39 Extended needs two characters for each non-native ASCII character, which costs density 211.

Fun facts

  • Some scanners switch into "extended mode" when they read a bar code containing the sequence +$, and switch back to regular mode on -$ 4.
  • On Zebra scanners Full ASCII conversion is disabled by default, and it "cannot" be enabled together with Trioptic Code 39 3. Zebra also says the Full ASCII to ASCII correlation "is host-dependent" 3.

Status

Active, but only as a reader-configuration option. The Code 39 family is currently standardised as ISO/IEC 16388:2023 1. Full ASCII mode is still built into current scanner firmware (Zebra) 3 and into actively maintained libraries such as zint, bwip-js and ZXing 612. Vendor support pages still deal with symbols misread because readers were not set to Full ASCII 78.

Sources

1 Code 39 — Wikipedia, accessed 2026. 2 Code 39 – Full ASCII — Seagull Scientific Barcode Guide, accessed 2026. 3 Code 39 Full ASCII Conversion — Zebra Technologies (SP72 Programmer Guide), accessed 2026. 4 Bar Codes: Code 39 — Four Js Genero Report Writer documentation, accessed 2026. 5 Code 39 Extended — DevExpress documentation, accessed 2026. 6 Code39Reader.java — ZXing (GitHub), accessed 2026. 7 Scanner is decoding a plus sign between characters in Code 39 barcodes — Wasp Barcode Technologies Helpdesk, accessed 2026. 8 Problems with the / character — IDAutomation Support, accessed 2026. 9 Code 93 — Wikipedia, accessed 2026. 10 Zint Barcode Generator manual (§6.1.7 Code 39) — zint project, accessed 2026. 11 Code 39 — Aspose.BarCode documentation, accessed 2026. 12 GitHub repositories zint/zint (incl. backend/code.c), metafloor/bwip-js, zxing/zxing — GitHub API metadata, accessed 2026-10. 13 python-barcode codex.py — python-barcode (GitHub), accessed 2026.

Deployments

No country reports mention this standard by name.

Regions / aggregations not mapped to a single country

  • Universal
source · content/standards/code-39-extended/index.md