# Code 39 Extended

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

Specifications:
- [Code 39 — Wikipedia (includes Full ASCII table)](https://en.wikipedia.org/wiki/Code_39)
- [Code 39 – Full ASCII — Seagull Scientific Barcode Guide](https://barcodeguide.seagullscientific.com/Content/Symbologies/Code_39_Full_ASCII.htm)

## Overview

**Code 39 Extended**, also called **Full ASCII Code 39** (and Code 39e or Code39+), is a variant of [Code 39](https://docs.barcoder.ai/docs/standards/code-39) that encodes all 128 ASCII characters by pairing a shift character (`$`, `%`, `/` or `+`) with a regular Code 39 character <sup>[1][1]</sup><sup>[5][5]</sup><sup>[10][10]</sup>. 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 <sup>[2][2]</sup><sup>[3][3]</sup>.

## History

Code 39 itself was developed in **1974** by **Dr. David Allais and Ray Stevens** of **Interface Mechanisms Inc. (Intermec)** <sup>[1][1]</sup><sup>[2][2]</sup>. 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 <sup>[1][1]</sup>. Seagull Scientific describes Full ASCII as "an extension of the original Code 39 symbology" <sup>[2][2]</sup>. None of the fetched sources gives the year Full ASCII mode was introduced or who devised it. In 1982 Intermec designed [Code 93](https://docs.barcoder.ai/docs/standards/code-93) to improve on Code 39, and Code 93 includes its own full-ASCII scheme <sup>[9][9]</sup>.

## 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 <sup>[2][2]</sup>. Base Code 39 encodes 43 characters: `0-9`, `A-Z`, `-`, `.`, space, `$`, `/`, `+` and `%` <sup>[1][1]</sup><sup>[10][10]</sup>.
- **Shift pairs:** each of the remaining ASCII characters is written as two Code 39 characters <sup>[1][1]</sup><sup>[6][6]</sup>:
  - `$` + `A`–`Z` gives control characters (for example `$A` = SOH) <sup>[1][1]</sup><sup>[6][6]</sup>.
  - `%` + letter gives ESC through US, the punctuation `[ \ ] ^ _ { | } ~`, and NUL (`%U`), `@` (`%V`), `` ` `` (`%W`) and DEL (`%T`, `%X`, `%Y` or `%Z`) <sup>[1][1]</sup><sup>[6][6]</sup>.
  - `/` + `A`–`O` gives `!` through `,`, and `/Z` gives `:` <sup>[1][1]</sup><sup>[6][6]</sup>.
  - `+` + `A`–`Z` gives lower-case `a`–`z` <sup>[1][1]</sup><sup>[2][2]</sup><sup>[6][6]</sup>.
- **Characters that keep their single-character form:** `0-9`, `A-Z`, `.`, `-` and space look the same in Full ASCII as in plain Code 39 <sup>[1][1]</sup>. 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` <sup>[1][1]</sup>.
- **Capacity:** zint caps Extended Code 39 at **86 symbol characters**, counted after expansion into shift pairs <sup>[10][10]</sup><sup>[12][12]</sup>. 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 <sup>[2][2]</sup><sup>[11][11]</sup>.
- **Check character:** an optional modulo-43 check digit, the same as in plain Code 39 <sup>[2][2]</sup><sup>[5][5]</sup><sup>[10][10]</sup>.
- **Decoding:** a reader in Full ASCII mode reads a shift character and, instead of sending it, combines it with the next character <sup>[2][2]</sup>. 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` <sup>[6][6]</sup>.

## 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 <sup>[5][5]</sup><sup>[4][4]</sup>. 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 <sup>[4][4]</sup><sup>[5][5]</sup>.
- **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 <sup>[2][2]</sup>. Zint's [LOGMARS](https://docs.barcoder.ai/docs/standards/logmars) variant, however, accepts only the standard Code 39 character set and up to 30 characters <sup>[10][10]</sup>.
- **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 <sup>[11][11]</sup>. These sources describe Code 39 as a whole. None of them identifies a deployment that requires Full ASCII specifically.

## Implementations

- **[zint](https://github.com/zint/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 <sup>[10][10]</sup><sup>[12][12]</sup>.
- **[bwip-js](https://github.com/metafloor/bwip-js)** (JavaScript, ~2.4k stars, active August 2026): an encoder with the `code39ext` symbology ID, which this site's playground uses <sup>[12][12]</sup>.
- **[ZXing](https://github.com/zxing/zxing)** (Java, ~34.1k stars, active September 2026): a decoder. Full ASCII is opt-in through the `extendedMode` constructor flag of `Code39Reader` <sup>[6][6]</sup><sup>[12][12]</sup>.
- **[python-barcode](https://github.com/WhyNotHugo/python-barcode)** (Python, ~656 stars) converts Code 39 input to upper case, so it does not produce Full ASCII symbols <sup>[13][13]</sup>.

## Comparison

- **Versus plain [Code 39](https://docs.barcoder.ai/docs/standards/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 <sup>[7][7]</sup>. 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 <sup>[6][6]</sup>. 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 <sup>[3][3]</sup><sup>[7][7]</sup>.
- **Versus [Code 93](https://docs.barcoder.ai/docs/standards/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 <sup>[9][9]</sup>. Zint calls Code 93 "a variation of Extended Code 39" <sup>[10][10]</sup>.
- **Versus [Code 128](https://docs.barcoder.ai/docs/standards/code-128):** Code 128 encodes full ASCII natively. Code 39 Extended needs two characters for each non-native ASCII character, which costs density <sup>[2][2]</sup><sup>[11][11]</sup>.

## Fun facts

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

## Status

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

## Sources

[1] [Code 39](https://en.wikipedia.org/wiki/Code_39) — Wikipedia, accessed 2026.
[2] [Code 39 – Full ASCII](https://barcodeguide.seagullscientific.com/Content/Symbologies/Code_39_Full_ASCII.htm) — Seagull Scientific Barcode Guide, accessed 2026.
[3] [Code 39 Full ASCII Conversion](https://docs.zebra.com/us/en/scanners/general/sp72-prg/c-param-desc-symbologies/r-param-desc-code-39/r-param-desc-code-39-full-ascii-conversion.html) — Zebra Technologies (SP72 Programmer Guide), accessed 2026.
[4] [Bar Codes: Code 39](https://4js.com/online_documentation/fjs-grw-manual-html/gst-topics/c_grd_barcodes_code_39.html) — Four Js Genero Report Writer documentation, accessed 2026.
[5] [Code 39 Extended](https://docs.devexpress.com/OfficeFileApiJava/405792/barcode-generation-api/barcode-types/code-39-extended) — DevExpress documentation, accessed 2026.
[6] [Code39Reader.java](https://github.com/zxing/zxing/blob/master/core/src/main/java/com/google/zxing/oned/Code39Reader.java) — ZXing (GitHub), accessed 2026.
[7] [Scanner is decoding a plus sign between characters in Code 39 barcodes](https://support.waspbarcode.com/kb/articles/scanner-is-decoding-a-plus-sign-between-characters-in-code-39-barcodes) — Wasp Barcode Technologies Helpdesk, accessed 2026.
[8] [Problems with the / character](https://support.idautomation.com/Barcode-FAQ/Problems-with-the-/-character/_1469) — IDAutomation Support, accessed 2026.
[9] [Code 93](https://en.wikipedia.org/wiki/Code_93) — Wikipedia, accessed 2026.
[10] [Zint Barcode Generator manual (§6.1.7 Code 39)](https://github.com/zint/zint/blob/master/docs/manual.txt) — zint project, accessed 2026.
[11] [Code 39](https://docs.aspose.com/barcode/info-cards/code-39) — Aspose.BarCode documentation, accessed 2026.
[12] GitHub repositories [zint/zint](https://github.com/zint/zint) (incl. `backend/code.c`), [metafloor/bwip-js](https://github.com/metafloor/bwip-js), [zxing/zxing](https://github.com/zxing/zxing) — GitHub API metadata, accessed 2026-10.
[13] [python-barcode `codex.py`](https://github.com/WhyNotHugo/python-barcode/blob/main/barcode/codex.py) — python-barcode (GitHub), accessed 2026.

[1]: https://en.wikipedia.org/wiki/Code_39
[2]: https://barcodeguide.seagullscientific.com/Content/Symbologies/Code_39_Full_ASCII.htm
[3]: https://docs.zebra.com/us/en/scanners/general/sp72-prg/c-param-desc-symbologies/r-param-desc-code-39/r-param-desc-code-39-full-ascii-conversion.html
[4]: https://4js.com/online_documentation/fjs-grw-manual-html/gst-topics/c_grd_barcodes_code_39.html
[5]: https://docs.devexpress.com/OfficeFileApiJava/405792/barcode-generation-api/barcode-types/code-39-extended
[6]: https://github.com/zxing/zxing/blob/master/core/src/main/java/com/google/zxing/oned/Code39Reader.java
[7]: https://support.waspbarcode.com/kb/articles/scanner-is-decoding-a-plus-sign-between-characters-in-code-39-barcodes
[8]: https://support.idautomation.com/Barcode-FAQ/Problems-with-the-/-character/_1469
[9]: https://en.wikipedia.org/wiki/Code_93
[10]: https://github.com/zint/zint/blob/master/docs/manual.txt
[11]: https://docs.aspose.com/barcode/info-cards/code-39
[12]: https://github.com/zint/zint
[13]: https://github.com/WhyNotHugo/python-barcode/blob/main/barcode/codex.py

## Deployments

_No country reports mention this standard by name._

## Regions / aggregations not mapped to a single country

- Universal
