Code 128
Code 128 is 7494122205787105a very high-density barcode symbology. It is used for alphanumeric or numeric-only barcodes. It can encode all 128 characters of ASCII and, by use of an extension character (FNC4), the Latin-1 characters defined in ISO/IEC 8859-1.
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. The symbology was formerly defined as ISO/IEC 15417:2007.
Specification
A Code 128 barcode will have six sections:
- Quiet zone
- Start character
- Encoded data
- Check character
- Stop character
- Quiet zone
The check character is calculated from a weighted sum (modulo 103) of all the characters.
Subtypes
Code 128 includes 108 symbols: 103 data symbols, 3 start symbols, and 2 stop symbols. The symbols consist of three black bars and three white spaces of varying widths. Each bar width is 1 to 4 modules (a module is a unit width) wide. All but the stop symbol are fixed width: the sum of the widths of the three black bars and three white bars is fixed.
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 is recognized. When the stop pattern is read right-to-left, the reverse stop symbol is recognized. A scanner seeing the reverse stop symbol then knows it must read the symbol 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):
- 128A (Code Set A) – ASCII characters 00 to 95 (0–9, A–Z and control codes), special characters, and FNC 1–4
- 128B (Code Set B) – ASCII characters 32 to 127 (0–9, A–Z, a–z), special characters, and FNC 1–4
- 128C (Code Set C) – 00–99 (encodes two digits with a single code point) and FNC1
Quiet zone
The minimum width of the Quiet Zone to the left and right of the 128 Bar Code is 10x, where x is the minimum width of a module. It is mandatory at the left and right side of the barcode. The quiet zone must not be less than 4 mm × 1.65 mm depending on the type of bar code. Source: Figure 5.2.1.4.4 – 1 of GS1 General Specifications
Start/stop and encoded data
Each character in the barcode symbol is composed of three bars and three spaces except for the stop character, which adds an additional extra bar of length 2. 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 character. For instance, encoding the ASCII character "0" can be viewed as 10011101100, where a 1 is a bar and a 0 is a space. A single 1 would be the thinnest line in the bar code. Three 1s in sequence (111) indicates a bar three times as thick as a single 1 bar.
The code uses 107 of the 108 possible patterns that fulfill the required criteria, with the pattern 211133 deliberately remaining unused. This is done to enhance omnidirectional scanning and help prevent misreads (if 211133 represented a legitimate symbol it could be mistaken for the stop code 2331112 when scanned backwards).
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 character's 'value' multiplied by its position in the barcode string. The start character and first encoded value 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 characters (following the instructions given below) and appended to the barcode, immediately before the stop character.
For example, in the following table, the code 128 variant A checksum value is calculated for the alphanumeric string PJJ123C:
Code | Value | Position | Value × Position |
---|---|---|---|
Start Code A | 103 | 1 | 103 |
P | 48 | 1 | 48 |
J | 42 | 2 | 84 |
J | 42 | 3 | 126 |
1 | 17 | 4 | 68 |
2 | 18 | 5 | 90 |
3 | 19 | 6 | 114 |
C | 35 | 7 | 245 |
Sum | 878 | ||
Remainder mod 103 | 54 |
Calculating check digit with multiple variants
As Code 128 allows multiple variants, as well as switching between variants within a single barcode, the absolute Code 128 value of a character is completely independent of its value within a given variant. For instance the Variant C value "33" and the Variant B value "A" are both considered to be a Code 128 value of 33, and the check digit would be computed based on the value of 33 times the character's position within the barcode.
Using FNC4 to encode high (128–255) characters
Function 4 (FNC4) can be used to encode all the LATIN-1 (ISO-8859-1) characters in a Code 128 barcode.[1] The feature is not widely supported and is not used in GS128.[2][3] When a single FNC4 is present in a string, the following character will be converted to ASCII as usual (character sets A and B) and then have 128 added to the ASCII value. (If the following symbol is a shift, then a second symbol will be used to obtain the character.) If two FNC4s are used consecutively then all following characters will be treated as such, up to the end of the string or another pair of FNC4s. Between the double FNC4s, a single FNC4 will be used to denote that the following character will be standard ASCII.[4]
Bar code widths
Code128 specifies a combination of 6 bars and spaces for each character except the Stop character, which uses 7. Thus, each character begins with a bar and ends with a space (with the exception of the stop character, which ends in a bar). The following tables detail the widths associated with each bar and space for each character. The width of each bar or space can be 1, 2, 3 or 4 units (modules). Using the example above, an 'A' would be depicted with the pattern 10100011000, or as 111323 in the tables below.
Value | 128A | 128B | 128C | ASCII Code (Common/Barcodesoft) | Character (Common/Barcodesoft) | Bar/Space Pattern | Bar/Space Weights |
---|---|---|---|---|---|---|---|
0 | space | space | 00 | 0032 or 0212 / 252 | Space or Ô / ü | 11011001100 | 212222 |
1 | ! | ! | 01 | 33 | ! | 11001101100 | 222122 |
2 | " | " | 02 | 34 | " | 11001100110 | 222221 |
3 | # | # | 03 | 35 | # | 10010011000 | 121223 |
4 | $ | $ | 04 | 36 | $ | 10010001100 | 121322 |
5 | % | % | 05 | 37 | % | 10001001100 | 131222 |
6 | & | & | 06 | 38 | & | 10011001000 | 122213 |
7 | ' | ' | 07 | 39 | ' | 10011000100 | 122312 |
8 | ( | ( | 08 | 40 | ( | 10001100100 | 132212 |
9 | ) | ) | 09 | 41 | ) | 11001001000 | 221213 |
10 | * | * | 10 | 42 | * | 11001000100 | 221312 |
11 | + | + | 11 | 43 | + | 11000100100 | 231212 |
12 | , | , | 12 | 44 | , | 10110011100 | 112232 |
13 | - | - | 13 | 45 | - | 10011011100 | 122132 |
14 | . | . | 14 | 46 | . | 10011001110 | 122231 |
15 | / | / | 15 | 47 | / | 10111001100 | 113222 |
16 | 0 | 0 | 16 | 48 | 0 | 10011101100 | 123122 |
17 | 1 | 1 | 17 | 49 | 1 | 10011100110 | 123221 |
18 | 2 | 2 | 18 | 50 | 2 | 11001110010 | 223211 |
19 | 3 | 3 | 19 | 51 | 3 | 11001011100 | 221132 |
20 | 4 | 4 | 20 | 52 | 4 | 11001001110 | 221231 |
21 | 5 | 5 | 21 | 53 | 5 | 11011100100 | 213212 |
22 | 6 | 6 | 22 | 54 | 6 | 11001110100 | 223112 |
23 | 7 | 7 | 23 | 55 | 7 | 11101101110 | 312131 |
24 | 8 | 8 | 24 | 56 | 8 | 11101001100 | 311222 |
25 | 9 | 9 | 25 | 57 | 9 | 11100101100 | 321122 |
26 | : | : | 26 | 58 | : | 11100100110 | 321221 |
27 | ; | ; | 27 | 59 | ; | 11101100100 | 312212 |
28 | < | < | 28 | 60 | < | 11100110100 | 322112 |
29 | = | = | 29 | 61 | = | 11100110010 | 322211 |
30 | > | > | 30 | 62 | > | 11011011000 | 212123 |
31 | ? | ? | 31 | 63 | ? | 11011000110 | 212321 |
32 | @ | @ | 32 | 64 | @ | 11000110110 | 232121 |
33 | A | A | 33 | 65 | A | 10100011000 | 111323 |
34 | B | B | 34 | 66 | B | 10001011000 | 131123 |
35 | C | C | 35 | 67 | C | 10001000110 | 131321 |
36 | D | D | 36 | 68 | D | 10110001000 | 112313 |
37 | E | E | 37 | 69 | E | 10001101000 | 132113 |
38 | F | F | 38 | 70 | F | 10001100010 | 132311 |
39 | G | G | 39 | 71 | G | 11010001000 | 211313 |
40 | H | H | 40 | 72 | H | 11000101000 | 231113 |
41 | I | I | 41 | 73 | I | 11000100010 | 231311 |
42 | J | J | 42 | 74 | J | 10110111000 | 112133 |
43 | K | K | 43 | 75 | K | 10110001110 | 112331 |
44 | L | L | 44 | 76 | L | 10001101110 | 132131 |
45 | M | M | 45 | 77 | M | 10111011000 | 113123 |
46 | N | N | 46 | 78 | N | 10111000110 | 113321 |
47 | O | O | 47 | 79 | O | 10001110110 | 133121 |
48 | P | P | 48 | 80 | P | 11101110110 | 313121 |
49 | Q | Q | 49 | 81 | Q | 11010001110 | 211331 |
50 | R | R | 50 | 82 | R | 11000101110 | 231131 |
51 | S | S | 51 | 83 | S | 11011101000 | 213113 |
52 | T | T | 52 | 84 | T | 11011100010 | 213311 |
53 | U | U | 53 | 85 | U | 11011101110 | 213131 |
54 | V | V | 54 | 86 | V | 11101011000 | 311123 |
55 | W | W | 55 | 87 | W | 11101000110 | 311321 |
56 | X | X | 56 | 88 | X | 11100010110 | 331121 |
57 | Y | Y | 57 | 89 | Y | 11101101000 | 312113 |
58 | Z | Z | 58 | 90 | Z | 11101100010 | 312311 |
59 | [ | [ | 59 | 91 | [ | 11100011010 | 332111 |
60 | \ | \ | 60 | 92 | \ | 11101111010 | 314111 |
61 | ] | ] | 61 | 93 | ] | 11001000010 | 221411 |
62 | ^ | ^ | 62 | 94 | ^ | 11110001010 | 431111 |
63 | _ | _ | 63 | 95 | _ | 10100110000 | 111224 |
64 | NUL | ` | 64 | 96 | ` | 10100001100 | 111422 |
65 | SOH | a | 65 | 97 | a | 10010110000 | 121124 |
66 | STX | b | 66 | 98 | b | 10010000110 | 121421 |
67 | ETX | c | 67 | 99 | c | 10000101100 | 141122 |
68 | EOT | d | 68 | 100 | d | 10000100110 | 141221 |
69 | ENQ | e | 69 | 101 | e | 10110010000 | 112214 |
70 | ACK | f | 70 | 102 | f | 10110000100 | 112412 |
71 | BEL | g | 71 | 103 | g | 10011010000 | 122114 |
72 | BS | h | 72 | 104 | h | 10011000010 | 122411 |
73 | HT | i | 73 | 105 | i | 10000110100 | 142112 |
74 | LF | j | 74 | 106 | j | 10000110010 | 142211 |
75 | VT | k | 75 | 107 | k | 11000010010 | 241211 |
76 | FF | l | 76 | 108 | l | 11001010000 | 221114 |
77 | CR | m | 77 | 109 | m | 11110111010 | 413111 |
78 | SO | n | 78 | 110 | n | 11000010100 | 241112 |
79 | SI | o | 79 | 111 | o | 10001111010 | 134111 |
80 | DLE | p | 80 | 112 | p | 10100111100 | 111242 |
81 | DC1 | q | 81 | 113 | q | 10010111100 | 121142 |
82 | DC2 | r | 82 | 114 | r | 10010011110 | 121241 |
83 | DC3 | s | 83 | 115 | s | 10111100100 | 114212 |
84 | DC4 | t | 84 | 116 | t | 10011110100 | 124112 |
85 | NAK | u | 85 | 117 | u | 10011110010 | 124211 |
86 | SYN | v | 86 | 118 | v | 11110100100 | 411212 |
87 | ETB | w | 87 | 119 | w | 11110010100 | 421112 |
88 | CAN | x | 88 | 120 | x | 11110010010 | 421211 |
89 | EM | y | 89 | 121 | y | 11011011110 | 212141 |
90 | SUB | z | 90 | 122 | z | 11011110110 | 214121 |
91 | ESC | { | 91 | 123 | { | 11110110110 | 412121 |
92 | FS | | | 92 | 124 | | | 10101111000 | 111143 |
93 | GS | } | 93 | 125 | } | 10100011110 | 111341 |
94 | RS | ~ | 94 | 126 | ~ | 10001011110 | 131141 |
95 | US | DEL | 95 | 200 / 240 | È / ð | 10111101000 | 114113 |
96 | FNC 3 | FNC 3 | 96 | 201 / 241 | É / ñ | 10111100010 | 114311 |
97 | FNC 2 | FNC 2 | 97 | 202 / 242 | Ê / ò | 11110101000 | 411113 |
98 | Shift B | Shift A | 98 | 203 / 243 | Ë / ó | 11110100010 | 411311 |
99 | Code C | Code C | 99 | 204 / 244 | Ì / ô | 10111011110 | 113141 |
100 | Code B | FNC 4 | Code B | 205 / 245 | Í / õ | 10111101110 | 114131 |
101 | FNC 4 | Code A | Code A | 206 / 246 | Î / ö | 11101011110 | 311141 |
102 | FNC 1 | FNC 1 | FNC 1 | 207 / 247 | Ï / ÷ | 11110101110 | 411131 |
103 | Start Code A | 208 / 248 | Ð / ø | 11010000100 | 211412 | ||
104 | Start Code B | 209 / 249 | Ñ / ù | 11010010000 | 211214 | ||
105 | Start Code C | 210 / 250 | Ò / ú | 11010011100 | 211232 | ||
106 | Stop (7 bars/spaces) | 211 / 251 | Ó / û | 1100011101011 | 2331112 | ||
— | Reverse Stop used to detect reading right to left |
— | — | 11010111000 | 211133 |
The "Code A", "Code B" and "Code C" symbols cause all future symbols to be interpreted according to the corresponding subcode. 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 can 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 that it 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. For example, 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] 0 [Check symbol 92] [Stop]
"
Check digit calculation for the above Zip code example:
Value | Weight | Weight × Value | |
---|---|---|---|
Start C | 105 | 1 | 105 |
FNC1 | 102 | 1 | 102 |
42 | 42 | 2 | 84 |
18 | 18 | 3 | 54 |
40 | 40 | 4 | 160 |
20 | 20 | 5 | 100 |
50 | 50 | 6 | 300 |
Code A | 101 | 7 | 707 |
0 | 16 | 8 | 128 |
Sum = | 1740 | ||
1740 | Mod 103 = | 92 | |
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
Although code set C uses one code symbol to represent two digits, its usage does not necessarily make a more compact code compared to code sets A or B. While encoding "X00Y" with code set A or B results in 7 code symbols (e.g., [Start B] 56 16 16 57 [checksum] [Stop]
), encoding the inner "00" with code set C will result in a code 8 symbols long due to the overhead in switching in and out of code set C. Although one symbol is saved on encoding "00" to code symbol C, two code set switching symbols are required: the first to switch into code set C and the second to switch back to code set A or B (e.g., [Start B] 56 [Code C] 00 [Code B] 57 [checksum] [Stop]
).
Conversely, applying of code set C to a sequence of digits produces code with fewer symbols compared to code sets A or B only under these conditions:
Position of sequence of digits in data | Number of digits for switching to code set C |
---|---|
beginning of data | 4+ |
end of data | 4+ |
middle of data (surrounded by characters from code set A or B) | 6+ |
entire data | either 2 or 4+ |
Example: For data "098x1234567y23", savings on barcode length using code set C are achieved only if it is applied to middle part of data and the transition to code set C is done when there are an even number of digits remaining to encode (so "234567"). For beginning and ending part of the code, switching to code set C is not effective. Code symbols: [Start B] 16 25 24 88 17 [Code C] 23 45 67 [Code B] 89 18 19 [checksum] [Stop]
.
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]
.[5]
Optimizing length of resulting barcode is important where barcode readers are used which require to detect the entire barcode image at once in order to read a barcode, such as 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.
References
- ↑ Apparently ISO 15417 Annex F
- ↑ Softmatic, http://www.softmatic.com/barcode-code-128.html, stating, "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."
- ↑ 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."
- ↑ http://www.han-soft.com/releases/barcode1d/documents/b_code128.html stating, "If a single "FNC 4" character is used, indicates the following data character in the symbol is a 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."
- ↑ GS1 General Specifications, Version 13, Issue 1, Jan-2013, Section 5.4.7.7. Use of Start, Code Set, and Shift Characters to Minimize Symbol Length (Informative), pages 268 to 269. This section gives the compression strategy.
External links
- GS1-128 Specification – A detailed list of Application Identifiers.
- Barcodesoft – Font mapping of Barcodesoft, which differs from the common ascii mapping (see http://ascii-code.com/).
- The 128 code – Learn the Code 128 encoding algorithm with a font-based barcode solution.
- Online barcode generator – Free online Barcode generator for the various barcode types.
Sample code
- ZXing – Multiplatform open source barcode scanner / generator with versions available in Java (core project) and ports to ActionScript, C++, C#, ObjectiveC and Ruby.
- Python Bar Code 128 – This code appears to draw boxes one pixel wide. It appears it was modified from a short line long line bar code which would have drawn lines. The "Black boxes" should be the same size as the "White Boxes".
- GenCode128 – Free C# source code implementation of Code128. Almost all features are implemented, but is not 100% complete.
- Barcode1DTools Ruby gem – Ruby source code for many 1D barcode symbologies including Code 128.
- Perl barcode generation code – Perl source code for many 1D barcode symbologies including Code 128.
- Barcode::Code128 – Free Perl barcode generation module.
- GOCR – Free OCR with Code 128 recognition.
- Barcode Code 128 – Free JavaScript source code implementation of Code128.
- Barcode4J – Free Java API with implementation of Code128 and other standard barcodes.
- JavaScript Code 128 – Open source JavaScript implementation of Code128 and other linear barcodes.