Code 128

Last updated
A Swiss postal barcode encoding "RI 476 394 652 CH" in Code 128 (B & C) 9494-RI476394652CH.jpg
A Swiss postal barcode encoding "RI 476 394 652 CH" in Code 128 (B & C)

Code 128 is a high-density linear barcode symbology defined in ISO/IEC 15417:2007. [1] It is used for alphanumeric or numeric-only barcodes. It can encode all 128 characters of ASCII and, by use of an extension symbol (FNC4), the Latin-1 characters defined in ISO/IEC 8859-1.[ citation needed ] It generally results in more compact barcodes compared to other methods like Code 39, especially when the texts contain mostly digits. Code 128 was developed by the Computer Identics Corporation in 1981. [2]

Contents

A GS1-128 barcode encoding GTIN, best before date and batch number GS1-128 product barcode.jpg
A GS1-128 barcode encoding GTIN, best before date and batch number

GS1-128 (formerly known as UCC/EAN-128) is a subset of Code 128 and is used extensively worldwide in shipping and packaging industries as a product identification code for the container and pallet levels in the supply chain.

Specification

Schematic of a barcode (Code 128B).
1:quiet zone, 2:Start Code B, 3:data, 4:checksum, 5:stop Barcode diagram.svg
Schematic of a barcode (Code 128B).
1:quiet zone, 2:Start Code B, 3:data, 4:checksum, 5:stop

A Code 128 barcode has seven sections:

  1. Quiet zone
  2. Start symbol
  3. Encoded data
  4. Check symbol (mandatory)
  5. Stop symbol
  6. Final bar (often considered part of the stop symbol)
  7. Quiet zone

The check symbol is calculated from a weighted sum (modulo 103) of all the symbols.

Subtypes

Code 128 includes 108 symbols: 103 data symbols, 3 start symbols, and 2 stop symbols. Each symbol consists of three black bars and three white spaces of varying widths. All widths are multiples of a basic "module". Each bar and space is 1 to 4 modules wide, and the symbols are fixed width: the sum of the widths of the three black bars and three white bars is 11 modules.

The stop pattern is composed of two overlapped symbols and has four bars. The stop pattern permits bidirectional scanning. When the stop pattern is read left-to-right (the usual case), the stop symbol (followed by a 2-module bar) is recognized. When the stop pattern is read right-to-left, the reverse stop symbol (followed by a 2-module bar) is recognized. A scanner seeing the reverse stop symbol then knows it must skip the 2-module bar and read the rest of the barcode in reverse.

Despite its name, Code 128 does not have 128 distinct symbols, so it cannot represent 128 code points directly. To represent all 128 ASCII values, it shifts among three code sets (A, B, C). Together, code sets A and B cover all 128 ASCII characters. Code set C is used to efficiently encode digit strings. The initial subset is selected by using the appropriate start symbol. Within each code set, some of the 103 data code points are reserved for shifting to one of the other two code sets. The shifts are done using code points 98 and 99 in code sets A and B, 100 in code sets A and C and 101 in code sets B and C to switch between them):

The minimum width of the quiet zone to the left and right of the Code 128 is 10x, where x is the minimum width of a module. It is mandatory at the left and right side of the barcode.

Start/stop and bar widths

Each symbol in the barcode is composed of three bars and three spaces. Each bar or space is 1, 2, 3 or 4 units wide, the sum of the widths of bars must be even (4, 6 or 8 units), the sum of the widths of the spaces must be odd (3, 5 or 7 units), and total 11 units per symbol. For instance, encoding the ASCII character "0" can be viewed as 10011101100, where a sequence of 1's is a bar and a sequence of 0's is a space. A single 1 would be the thinnest line in the bar code. Three 1's in sequence (111) indicates a bar three times as thick as a single 1 bar.

There are 108 possible 11-unit wide symbols, and the code uses all possible symbols. Two of the symbols are used for stop (end-of-barcode) indication, stop and reverse stop. The two stop symbols are special because they are always followed by a 2-unit bar, forming a 13-unit long stop pattern. Reading the stop pattern left to right is the stop symbol (followed by a 2-unit bar), and reading the stop pattern right to left is the reverse stop symbol (followed by a 2-unit bar).

Check digit calculation

The check digit is a weighted modulo-103 checksum. It is calculated by summing the start code 'value' to the products of each symbol's 'value' multiplied by its position's weight in the barcode string. The start symbol and first encoded symbol are in position 1. The sum of the products is then reduced modulo 103. The remainder is then converted back to one of the 103 non-delimiter symbols (following the instructions given below) and appended to the barcode, immediately before the stop symbol.

For example, in the following table, the code 128 variant A checksum value is calculated for the alphanumeric string PJJ123C:

CodeValueWeightValue × Weight
Start Code A103(1)103
P48148
J42284
J423126
117468
218590
3196114
C357245
Sum878
Remainder mod 10354

So the value 54, which equals a V, is appended, then followed by the Stop code.

For the purpose of computing the check symbol, the shift and code-switch symbols are treated the same as any other symbol in the bar code.

Using FNC4 to encode high (160–255) characters

The special symbol FNC4 ("Function 4"), present only in code sets A and B, can be used to encode all the Latin-1 (ISO-8859-1) characters in a Code 128 barcode. [3]

When a single 'FNC4' is present in a string, the following symbol is read like ASCII, but the value is incremented by +128, thus taking the higher range of the ISO-8859-1 table. If the following symbol is a 'SHIFT', then a second symbol will be used to obtain the character.

If two consecutive 'FNC4' characters are used, all following data characters are extended ASCII characters until two further consecutive 'FNC4' characters are encountered or the end of the symbol is reached. If during this sequence of extended encodation a single 'FNC4' character is encountered it is used to revert to standard ASCII encodation for the next data character only. 'SHIFT' and character subset characters shall have their normal effect during such a sequence. [4]

From Code 128A you can reach Latin-1 special characters from 160 (hex A0, non breaking space) up to 223 (hex DF, ß) via FNC4. The lower case characters from 224 (hex E0, à) to 254 (hex FE, þ) are available by FNC4+SHIFT B. The characters ÷ (247, hex F7) and ÿ (255, hex FF) are not available.

The feature is not available for GS1-128. [5] [6] Since the support of Code 128 Type B (and C) is not very common, it might be easier to use a QR Code instead for characters from the ISO-8859-1 code range.

Bar code widths

Code128 specifies a combination of 6 alternating bars and spaces (3 of each) for each symbol. Thus, each symbol begins with a bar and ends with a space. In barcode fonts, the final bar is generally combined with the stop symbol to make a wider stop pattern. The following table details the widths associated with each bar and space for each symbol. The width of each bar or space may be 1, 2, 3 or 4 units (modules). Using the example above, an 'A' would be depicted with the pattern 10100011000, or as widths 111323 in the tables below.

The widths value is derived by counting the length of each run of 1's then 0's in the pattern, starting from the left. There will always be 6 runs and the lengths of these 6 runs form the Widths value. For example, using the pattern 10100011000, the run lengths are 1 (digit 1), 1 (digit 0), 1 (digit 1), 3 (digit 0), 2 (digit 1), 3 (digit 0). Reporting just the lengths of each run gives 1, 1, 1, 3, 2, 3, thereby producing a widths value of 111323.

Code 128
ValueHex value128A128B128CFont position
(Common/Uncommon/Barcodesoft)
Bar/Space
Code Latin-1 PatternWidths
000 space space0032 or 194 or 207 / 212 / 252 or  or Ï / Ô / ü11011001100212222
101 ! !0133 !11001101100222122
202""0234"11001100110222221
303##0335#10010011000121223
404$$0436$10010001100121322
505 % %0537 %10001001100131222
606&&0638&10011001000122213
707''0739'10011000100122312
808((0840(10001100100132212
909))0941)11001001000221213
100a**1042*11001000100221312
110b++1143+11000100100231212
120c,,1244,10110011100112232
130d--1345-10011011100122132
140e..1446.10011001110122231
150f//1547/10111001100113222
1610001648010011101100123122
1711111749110011100110123221
1812221850211001110010223211
1913331951311001011100221132
2014442052411001001110221231
2115552153511011100100213212
2216662254611001110100223112
2317772355711101101110312131
2418882456811101001100311222
2519992557911100101100321122
261a : :2658 :11100100110321221
271b ; ;2759 ;11101100100312212
281c<<2860<11100110100322112
291d==2961=11100110010322211
301e>>3062>11011011000212123
311f ? ?3163 ?11011000110212321
3220@@3264@11000110110232121
3321AA3365A10100011000111323
3422BB3466B10001011000131123
3523CC3567C10001000110131321
3624DD3668D10110001000112313
3725EE3769E10001101000132113
3826FF3870F10001100010132311
3927GG3971G11010001000211313
4028HH4072H11000101000231113
4129II4173I11000100010231311
422aJJ4274J10110111000112133
432bKK4375K10110001110112331
442cLL4476L10001101110132131
452dMM4577M10111011000113123
462eNN4678N10111000110113321
472fOO4779O10001110110133121
4830PP4880P11101110110313121
4931QQ4981Q11010001110211331
5032RR5082R11000101110231131
5133SS5183S11011101000213113
5234TT5284T11011100010213311
5335UU5385U11011101110213131
5436VV5486V11101011000311123
5537WW5587W11101000110311321
5638XX5688X11100010110331121
5739YY5789Y11101101000312113
583aZZ5890Z11101100010312311
593b[[5991[11100011010332111
603c\\6092\11101111010314111
613d]]6193]11001000010221411
623e^^6294^11110001010431111
633f__6395_10100110000111224
6440 NUL `6496`10100001100111422
6541SOHa6597a10010110000121124
6642STXb6698b10010000110121421
6743 ETX c6799c10000101100141122
6844 EOT d68100d10000100110141221
6945 ENQ e69101e10110010000112214
7046 ACK f70102f10110000100112412
7147 BEL g71103g10011010000122114
7248 BS h72104h10011000010122411
7349 HT i73105i10000110100142112
744a LF j74106j10000110010142211
754b VT k75107k11000010010241211
764c FF l76108l11001010000221114
774d CR m77109m11110111010413111
784e SO n78110n11000010100241112
794f SI o79111o10001111010134111
8050DLEp80112p10100111100111242
8151DC1q81113q10010111100121142
8252DC2r82114r10010011110121241
8353DC3s83115s10111100100114212
8454DC4t84116t10011110100124112
8555 NAK u85117u10011110010124211
8656SYNv86118v11110100100411212
8757 ETB w87119w11110010100421112
8858 CAN x88120x11110010010421211
8959EMy89121y11011011110212141
905a SUB z90122z11011110110214121
915b ESC {91123{11110110110412121
925cFS|92124|10101111000111143
935dGS}93125}10100011110111341
945eRS~94126~10001011110131141
955fUS DEL 95195 / 200 / 240Ã / È / ð10111101000114113
9660FNC 3FNC 396196 / 201 / 241Ä / É / ñ10111100010114311
9761FNC 2FNC 297197 / 202 / 242Å / Ê / ò11110101000411113
9862Shift BShift A98198 / 203 / 243Æ / Ë / ó11110100010411311
9963Code CCode C99199 / 204 / 244Ç / Ì / ô10111011110113141
10064Code BFNC 4Code B200 / 205 / 200È / Í / È10111101110114131
10165FNC 4Code ACode A201 / 206 / 246É / Î / ö11101011110311141
10266FNC 1FNC 1FNC 1202 / 207 / 247Ê / Ï / ÷11110101110411131
10367Start Code A203 / 208 / 248Ë / Ð / ø11010000100211412
10468Start Code B204 / 209 / 249Ì / Ñ / ù11010010000211214
10569Start Code C205 / 210 / 250Í / Ò / ú11010011100211232
1066aStop11000111010233111
Reverse Stop11010111000211133
Stop pattern (7 bars/spaces)206 / 211 / 251Î / Ó / û11000111010112331112

The "Code A", "Code B" and "Code C" symbols cause all following symbols to be interpreted according to the corresponding subcode (i.e. 128A, 128B or 128C). The "Shift" symbol switches a single following symbol's interpretation between subcodes A and B.

The encoded ASCII char depends on the actual used barcode-font. Especially the ASCII char of value 0 and of value 95 and above may be defined differently in the font that is installed.

The FNCx codes are used for special purposes. FNC1 at the beginning of a bar code indicates a GS1-128 bar code which begins with a 2- 3- or 4-digit application identifier assigned by the Uniform Code Council, which explains the following digits. For example, application identifier 421 indicates that an ISO 3166-1 numeric country code and ship-to postal code follows. Thus, the U.S. ZIP code for the White House would generally be printed as "(421) 840 20500", but would actually be coded as "[Start C] [FNC1] 42 18 40 20 50 [Code A] 16 [Check symbol 92] [Stop]"

FNC2 (message append) can appear anywhere within a barcode to indicate that the barcode reader should store the current string and prepend it to the string of the next barcode that's read. It is not used by GS1-128.

FNC3 (initialize) can appear anywhere within a barcode to instruct the barcode reader to initialize or reprogram itself according to the barcode string's instructions.

FNC4 is used to represent an extended ASCII character set (see § Notes). It is not used by GS1-128. [7]

Availability

For the end user, Code 128 barcodes may be generated by either an outside application to create an image of the barcode, or by a font-based barcode solution. Either solution requires the use of an application or an application add in to calculate the check digit and create the barcode.

Barcode length optimization by Code 128 Type-C

Code set C uses one code symbol to represent two digits. Thus it may create shorter barcodes if the content consists of numbers only or if there are longer sequences of digits within the code.

However, when the string contains only a few digits or it's mixed with non-digit character, it does not always produce a more compact code than code sets A or B. Using code set C saves one symbol per two digits, but costs a mode-shift symbol to enter and exit the set. Thus, it is only worth using if there are enough consecutive digits. For example, encoding the string "X00Y" with code set A or B requires 7 code symbols ([Start B] 56 16 16 57 [checksum] [Stop]), while using code set C for the "X00Y" would result in a code 8 symbols long ([Start B] 56 [Code C] 00 [Code B] 57 [checksum] [Stop]).

Using code set C is only advantageous under the following conditions:

Location of digitsNumber of consecutive digits
beginning of data4+
end of data4+
middle of data (surrounded by symbols from code set A or B)6+
entire dataeither 2 or 4+ (but not 3)

At the end of a string, delaying the transition to code set C until there are an even number of digits remaining avoids an extra symbol. Consider the string "...01234": a delayed switch produces ... 0 [Code C] 12 34 [checksum] [Stop] but an early switch produces ... [Code C] 01 23 [Code A] 4 [checksum] [Stop]. [8]

For example, given the string "098x1234567y23", savings on barcode length using code set C are achieved only if it is applied to middle part of the string. For the beginning and ending part of the string, switching to code set C is not effective. As there are an odd number of digits in the middle of the string, the odd one must use a different code set, but it makes no difference whether this is the first or last; 16 symbols are required in either case: [Start B] 0 9 8 x 1 [Code C] 23 45 67 [Code B] y 2 3 [checksum] [Stop], or [Start B] 0 9 8 x [Code C] 12 34 56 [Code B] 7 y 2 3 [checksum] [Stop].

Optimizing the length of the resulting barcode is important when barcode readers are used which must detect the entire barcode image at once in order to read it, such as common laser scanners. The longer the barcode is, the greater distance of laser barcode reader from barcode image is needed, making reading difficult or impossible above some threshold lengths/distances.

The optimal encoding can be found using a dynamic programming algorithm. [9]

Related Research Articles

<span class="mw-page-title-main">Universal Product Code</span> Barcode symbology used for tracking trade items in stores

The Universal Product Code is a barcode symbology that is used worldwide for tracking trade items in stores.

<span class="mw-page-title-main">Barcode</span> Optical machine-readable representation of data

A barcode or bar code is a method of representing data in a visual, machine-readable form. Initially, barcodes represented data by varying the widths, spacings and sizes of parallel lines. These barcodes, now commonly referred to as linear or one-dimensional (1D), can be scanned by special optical scanners, called barcode readers, of which there are several types.

<span class="mw-page-title-main">Code 39</span> Variable length, discrete barcode symbology

Code 39 is a variable length, discrete barcode symbology defined in ISO/IEC 16388:2007.

<span class="mw-page-title-main">PDF417</span> Type of barcode

PDF417 is a stacked linear barcode format used in a variety of applications such as transport, identification cards, and inventory management. "PDF" stands for Portable Data File. The "417" signifies that each pattern in the code consists of 4 bars and spaces in a pattern that is 17 units (modules) long. The PDF417 symbology was invented by Dr. Ynjiun P. Wang at Symbol Technologies in 1991. It is defined in ISO 15438.

<span class="mw-page-title-main">Aztec Code</span> Type of matrix barcode

The Aztec Code is a matrix code invented by Andrew Longacre, Jr. and Robert Hussey in 1995. The code was published by AIM, Inc. in 1997. Although the Aztec Code was patented, that patent was officially made public domain. The Aztec Code is also published as ISO/IEC 24778:2008 standard. Named after the resemblance of the central finder pattern to an Aztec pyramid, Aztec Code has the potential to use less space than other matrix barcodes because it does not require a surrounding blank "quiet zone".

<span class="mw-page-title-main">Code 93</span>

Code 93 is a barcode symbology designed in 1982 by Intermec to provide a higher density and data security enhancement to Code 39. It is an alphanumeric, variable length symbology. Code 93 is used primarily by Canada Post to encode supplementary delivery information. Every symbol includes two check characters.

<span class="mw-page-title-main">Interleaved 2 of 5</span> Type of barcode

Interleaved 2 of 5 (ITF) is a continuous two-width barcode symbology encoding digits. It is used commercially on 135 film, for ITF-14 barcodes, and on cartons of some products, while the products inside are labeled with UPC or EAN.

Telepen is the name of a barcode symbology designed to encode all 128 ASCII characters without using shift characters for code switching, and only using two different widths for both bars and spaces.. The symbology was devised by George Sims of SB Electronic Systems Ltd. Telepen was originally designed in the UK in 1972.

<span class="mw-page-title-main">Data Matrix</span> Two-dimensional matrix barcode

A Data Matrix is a two-dimensional code consisting of black and white "cells" or dots arranged in either a square or rectangular pattern, also known as a matrix. The information to be encoded can be text or numeric data. Usual data size is from a few bytes up to 1556 bytes. The length of the encoded data depends on the number of cells in the matrix. Error correction codes are often used to increase reliability: even if one or more cells are damaged so it is unreadable, the message can still be read. A Data Matrix symbol can store up to 2,335 alphanumeric characters.

<span class="mw-page-title-main">International Article Number</span> Standard barcode system used in global trade

The International Article Number is a standard describing a barcode symbology and numbering system used in global trade to identify a specific retail product type, in a specific packaging configuration, from a specific manufacturer. The standard has been subsumed in the Global Trade Item Number standard from the GS1 organization; the same numbers can be referred to as GTINs and can be encoded in other barcode symbologies defined by GS1. EAN barcodes are used worldwide for lookup at retail point of sale, but can also be used as numbers for other purposes such as wholesale ordering or accounting. These barcodes only represent the digits 0–9, unlike some other barcode symbologies which can represent additional characters.

Codabar is a linear barcode symbology developed in 1972 by Pitney Bowes Corp. It and its variants are also known as Codeabar, Ames Code, NW-7, Monarch, Code 2 of 7, Rationalized Codabar, ANSI/AIM BC3-1995 or USD-4. Although Codabar has not been registered for US federal trademark status, its hyphenated variant Code-a-bar is a registered trademark.

<span class="mw-page-title-main">MSI Barcode</span> Barcode symbology

MSI is a barcode symbology developed by the MSI Data Corporation, based on the original Plessey Code symbology. It is a continuous symbology that is not self-checking. MSI is used primarily for inventory control, marking storage containers and shelves in warehouse environments.

<span class="mw-page-title-main">GS1 DataBar Coupon</span>

The GS1 Databar Coupon code has been in use in retail industry since the mid-1980s. At first, it was a UPC with system ID 5. Since UPCs cannot hold more than 12 digits, it required another barcode to hold additional information like offer code, expiration date and household ID numbers. Therefore, the code was often extended with an additional UCC/EAN 128 barcode. EAN 13 was sometimes used instead of UPC, and because it starts with 99, it was called the EAN 99 coupon barcode, and subsequently GS1 DataBar. After more than 20 years in use, there is now a need to encode more data for complex coupons, and to accommodate longer company IDs, so the traditional coupon code has become less efficient and sometimes not usable at all.

<span class="mw-page-title-main">Industrial 2 of 5</span>

Industrial 2 of 5. is a variable length, discrete, two width symbology. Industrial 2 of 5 is a subset of two-out-of-five codes.

<span class="mw-page-title-main">Codablock</span>

Codablock is a family of stacked 1D barcodes which was invented in Identcode Systeme GmbH in Germany in 1989 by Heinrich Oehlmann. Codablock barcodes are based on stacked Code 39 and Code 128 symbologies and have some advantages of 2D barcodes.

<span class="mw-page-title-main">Matrix 2 of 5</span>

Matrix 2 of 5 is a variable length, discrete, two width symbology. Matrix 2 of 5 is a subset of two-out-of-five codes. Unlike Industrial 2 of 5 code, Matrix 2 of 5 can encode data not only with black bars but with white spaces.

<span class="mw-page-title-main">MicroPDF417</span>

MicroPDF417 is two-dimensional (2D) stacked barcode symbology invented in 1996, by Frederick Schuessler, Kevin Hunter, Sundeep Kumar and Cary Chu from Symbol Technologies company. MicroPDF417 consists from specially encoded Row Address Patterns (RAP) columns and aligned to them Data columns encoded in "417" sequence which was invented in 1990. In 2006, the standard was registered as ISO/IEC 24728:2006.

<span class="mw-page-title-main">Han Xin code</span> Type of matrix barcode

Han Xin code is two-dimensional (2D) matrix barcode symbology invented in 2007 by Chinese company The Article Numbering Center of China to break monopoly of QR code. As QR code, Han Xin code consists of black squares and white square spaces arranged in a square grid on a white background. It has four finder patterns and other markers which allow to recognize it with camera-based readers. Han Xin code contains Reed–Solomon error correction with ability to read corrupted images. At this time, it is issued as ISO/IEC 20830:2021.

<span class="mw-page-title-main">DotCode</span> Type of matrix barcode

DotCode is two-dimensional (2D) matrix barcode invented in 2008 by Hand Held Products company to replace outdated Code 128. At this time, it is issued by Association for Automatic Identification and Mobility (AIM) as “ISS DotCode Symbology Specification 4.0”. DotCode consists of sparse black round dots and white spaces on white background. In case of black background round dots, creating barcode, can be white. DotCode was developed to use with high-speed industrial printers where printing accuracy can be low. Because DotCode by the standard does not require complicated elements like continuous lines or special shapes it can be applied with laser engraving or industrial drills.

<span class="mw-page-title-main">Rectangular Micro QR Code</span> Type of matrix barcode

Rectangular Micro QR Code is two-dimensional (2D) matrix barcode invented and standardized in 2022 by Denso Wave as ISO/IEC 23941. rMQR Code is designed as a rectangular variation of QR code and has the same parameters and applications as original QR code. But rMQR Code is more suitable for the rectangular areas and has difference between width and height up to 19 in R7x139 version. In this way it can be used in places where 1D barcodes are used. rMQR Code can replace Code 128 and Code 39 barcodes with more effective data encoding.

References

  1. "ISO/IEC 15417:2007 - Information technology -- Automatic identification and data capture techniques -- Code 128 bar code symbology specification". www.iso.org. Retrieved 2018-02-15.
  2. "CODE 128 and GS1-128". Barcode Information & Tips. Keyence. Retrieved November 6, 2023.
  3. Apparently ISO 15417 Annex F
  4. "TBarcode1D_Code128". Han-soft corporation. Retrieved 2017-01-21. If a single "FNC 4" character is used, indicates the following data character in the symbol is an extended ASCII character. A 'SHIFT' character may follow the 'FNC 4' character if it is necessary to change character subset for the following data character. Subsequent data characters revert to the standard ASCII character set. If two consecutive 'FNC4' characters are used, all following data characters are extended ASCII characters until two further consecutive 'FNC4' characters are encountered or the end of the symbol is reached. If during this sequence of extended encodation a single "FNC4" character is encountered it is used to revert to standard ASCII encodation for the next data character only. 'SHIFT' and character subset characters shall have their normal effect during such a sequence.
  5. "Code 128 Explained". Softmatic GmbH. Retrieved 2017-01-21. In principle non-ASCII characters like German umlauts (e.g. ÄÖÜ) can be encoded in a Code 128 symbol by using a special character (FNC4). However, this feature is not widely supported. Using a 2D barcode symbology like Aztec or Datamatrix with dedicated support for non-ASCII data might be a better choice.
  6. GS1 General Specifications (January 2006 Version 7.0), section 5.3.1.1 GS1-128 Symbology Characteristics, stating, "Characters with ASCII values 128 to 255 may also be encoded in Code 128 Symbols. Characters with ASCII values 128 to 255 accessed by Function 4 Character (FNC4) are reserved for future use and are not used in GS1-128 Bar Code Symbols."
  7. "5.4.3.4.2 Function characters". GS1 General Specifications Standard. Version 23.0. GS1 AISBL: 287. Jan 2023. Retrieved June 28, 2023.
  8. GS1 General Specifications, Version 13, Issue 1, Jan-2013, Section 5.4.7.7. Use of Start, Code Set, and Shift symbols to Minimize Symbol Length (Informative), pages 268 to 269. This section gives the compression strategy.
  9. Skiena, Steven S. (2010). "8.9 War Story: Text Compression for Bar Codes". The Algorithm Design Manual (2nd ed.). Springer. ISBN   978-1-849-96720-4. dynamic programming led to an 8% tighter encoding on average.

Sample code