Code 128

      "Wikipedia" encoded in Code 128-B

      Code 128 is a 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[citation needed].

      GS1-128 (formerly known as UCC/EAN-128) is a subset of Code 128 and is used extensively world wide 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

      "Code 128 sections"
      Code 128 (GS1-128) sections. 1: Quiet zone, 2: Start/stop character, 3: [FNC1]+Encoded data, 4: Check character

      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 107 symbols: 103 data symbols, 3 start codes, and 1 stop code. To represent all 128 ASCII values, there are three code sets (A, B, C), which can be mixed within a single barcode (by using codes 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 each two digits with one code) and FNC1

      Quiet zone

      The quiet zone should be at least ten times the width of the narrowest bar/space element. It is mandatory at the left and right side of the barcode. The quiet zone must not be less than 6.4mm wide.

      Start/stop and encoded data

      Each character in the barcode symbol is composed of three bars and three spaces. (The stop 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, the sum of the widths of the spaces must be odd, and total 11 units per character. For instance, encoding the ASCII value 0 can be viewed as 10011101100, where a 1(One) is a bar and a 0 is a space. A combination which contains a single 1 would be the thinnest line in the bar code. A combination including three 1 (111) in sequence indicates a bar three times as thick as a single 1 bar.

      The code uses 107 of the 108 possible patterns that fulfil 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 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 is in position 1. The sum of the start code value and the products is then divided by 103. The remainder of the division is the check digit's 'value' which is then converted into a character (following the instructions given below) and appended to the end of the barcode.

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

      Position Code Value Position x Value
      1 Start Code A 103 103
      1 P 48 48
      2 J 42 84
      3 J 42 126
      4 1 17 68
      5 2 18 90
      6 3 19 114
      7 C 35 245
      Sum 878
      Divisor 103
      Sum/Divisor 8.524
      Remainder & Check Sum Value 54

      Calculating check digit with multiple variants

      As Code 128 allows multiple variants, as well as switching between variants within a single barcode, it is important to remember that 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.

      Conversion to char

      The final conversion is given by the following criteria: if the value to convert is less than 95 then the ASCII value is obtained by adding 32 to the check digit's value; otherwise the ASCII value is obtained adding 105 ( = 32 + 73). This is done to prevent the ASCII value falling within the unwanted range 127-199. Here are some examples:

        Value = 6: 6 + 32 = 38 ('&') ==> OK
        Value = 95: 95 + 32 = 127 ==> WRONG: illegal character; 95 + 105 = 200 ('È') ==> OK
      

      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. 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 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.

      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. Using the example above, an 'A' would be depicted with the pattern 10100011000, or as 111323 in the tables below.

      Code 128
      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 FNC4 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
      unused to prevent misreading 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 accoding 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 above Zip Code Example

      Value Weight Weight x 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.

      ↑Jump back a section

      External links

      Sample code

      • Python Bar Code 128 This code appears to draw boxes 1 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.
      ↑Jump back a section

      Read in another language

      Last modified on 7 June 2013, at 14:13