Code 128 - Code 128

Image
Een Zwitserse barcode-codering "RI 476 394 652 CH" in code 128-B

Code 128 is een lineaire barcodesymboliek met hoge dichtheid, gedefinieerd in ISO/IEC 15417:2007. Het wordt gebruikt voor alfanumerieke of alleen numerieke streepjescodes . Het kan alle 128 tekens van ASCII coderen en, door gebruik te maken van een extensiesymbool (FNC4), de Latin-1-tekens gedefinieerd in ISO/IEC 8859-1 .. Het resulteert over het algemeen in compactere streepjescodes in vergelijking met andere methoden zoals Code 39 , vooral als de teksten voornamelijk cijfers bevatten.

GS1-128 (voorheen bekend als UCC/EAN-128) is een subset van Code 128 en wordt wereldwijd op grote schaal gebruikt in de verzend- en verpakkingsindustrie als productidentificatiecode voor de container- en palletniveaus in de toeleveringsketen.

Specificatie

"Code 128 secties"
Schema van een streepjescode (code 128B).
1 : stille zone, 2 : startcode, 3 : data, 4 : checksum, 5 : stopcode

Een Code 128-barcode heeft zeven secties:

  1. Stiltezone
  2. Start symbool
  3. Gecodeerde gegevens
  4. Vinkje (verplicht)
  5. Stop symbool
  6. Laatste balk (vaak beschouwd als onderdeel van het stopsymbool)
  7. Stiltezone

Het controlesymbool wordt berekend uit een gewogen som ( modulo 103) van alle symbolen.

Subtypen

Code 128 bevat 108 symbolen: 103 datasymbolen, 3 startsymbolen en 2 stopsymbolen. Elk symbool bestaat uit drie zwarte balken en drie witte ruimtes van verschillende breedtes. Alle breedtes zijn veelvouden van een basis "module". Elke balk en ruimte is 1 tot 4 modules breed en de symbolen hebben een vaste breedte: de som van de breedtes van de drie zwarte balken en drie witte balken is 11 modules.

Het stoppatroon bestaat uit twee overlappende symbolen en heeft vier streepjes. Het stoppatroon maakt bidirectioneel scannen mogelijk. Wanneer het stoppatroon van links naar rechts wordt gelezen (het gebruikelijke geval), wordt het stopsymbool (gevolgd door een balk met 2 modules) herkend. Wanneer het stoppatroon van rechts naar links wordt gelezen, wordt het omgekeerde stopsymbool (gevolgd door een balk met 2 modules) herkend. Een scanner die het omgekeerde stopsymbool ziet, weet dan dat hij de balk met 2 modules moet overslaan en de rest van de streepjescode omgekeerd moet lezen.

Ondanks zijn naam heeft Code 128 geen 128 verschillende symbolen, dus het kan 128 codepunten niet rechtstreeks vertegenwoordigen. Om alle 128 ASCII-waarden weer te geven, verschuift het tussen drie codesets (A, B, C). Samen dekken de codesets A en B alle 128 ASCII-tekens. Codeset C wordt gebruikt om cijferreeksen efficiënt te coderen. De initiële subset wordt geselecteerd door het juiste startsymbool te gebruiken. Binnen elke codeset zijn enkele van de 103 datacodepunten gereserveerd voor het verschuiven naar een van de andere twee codesets. De verschuivingen worden gedaan met behulp van codepunten 98 en 99 in codesets A en B, 100 in codesets A en C en 101 in codesets B en C om ertussen te schakelen):

  • 128A (codeset A) – ASCII-tekens 00 tot 95 (0–9, A–Z en besturingscodes), speciale tekens en FNC 1-4
  • 128B (codeset B) – ASCII-tekens 32 tot 127 (0–9, A–Z, a–z), speciale tekens en FNC 1-4
  • 128C (codeset C) – 00-99 (codeert twee cijfers met een enkel codepunt) en FNC1

De minimale breedte van de stille zone links en rechts van de Code 128 is 10x, waarbij x de minimale breedte van een module is. Het is verplicht aan de linker- en rechterkant van de barcode.

Start/stop en gecodeerde gegevens

Elk symbool in de streepjescode bestaat uit drie streepjes en drie spaties. Elke balk of spatie is 1, 2, 3 of 4 eenheden breed, de som van de breedtes van de staven moet even zijn (4, 6 of 8 eenheden), de som van de breedtes van de spaties moet oneven zijn (3, 5 of 7 eenheden), en in totaal 11 eenheden per symbool. Het coderen van het ASCII-teken "0" kan bijvoorbeeld worden gezien als 10011101100, waarbij een reeks enen een balk is en een reeks nullen een spatie. Een enkele 1 zou de dunste lijn in de streepjescode zijn. Drie enen achter elkaar (111) geven een staaf aan die drie keer zo dik is als een enkele staaf van 1.

Er zijn 108 mogelijke symbolen van 11 eenheden breed en de code gebruikt alle mogelijke symbolen. Twee van de symbolen worden gebruikt voor stopaanduiding (einde streepjescode), stop en omgekeerde stop. De twee stopsymbolen zijn speciaal omdat ze altijd worden gevolgd door een balk van 2 eenheden, die een 13-eenheid lang stoppatroon vormen. Het van links naar rechts lezen van het stoppatroon is het stopsymbool (gevolgd door een balk van 2 eenheden) en het van rechts naar links lezen van het stoppatroon is het omgekeerde stopsymbool (gevolgd door een balk van 2 eenheden).

Controleer cijferberekening

Het controlecijfer is een gewogen modulo-103 controlesom. Het wordt berekend door de startcode 'waarde' op te tellen bij de producten van de 'waarde' van elk symbool, vermenigvuldigd met de positie in de streepjescodereeks. Het startsymbool en het eerste gecodeerde symbool staan ​​op positie 1. De som van de producten wordt dan gereduceerd modulo 103. De rest wordt dan terug omgezet naar een van de 103 niet-scheidingstekens (volgens de onderstaande instructies ) en toegevoegd aan de streepjescode , direct voor het stopsymbool.

In de volgende tabel wordt bijvoorbeeld de code 128 variant A checksum-waarde berekend voor de alfanumerieke tekenreeks PJJ123C:

Code Waarde Positie Waarde ×
positie
Startcode 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
Som 878
Resterende mod 103 54

Voor het berekenen van het controlesymbool worden de shift- en codeswitch-symbolen op dezelfde manier behandeld als elk ander symbool in de streepjescode. De controlesom wordt berekend over de symboolwaarden, ongeacht welke codeset op dat moment actief is. De codeset C-waarde "33" en de codeset B-waarde "A" worden bijvoorbeeld beide beschouwd als een code 128-waarde van 33, en het controlecijfer wordt berekend op basis van de waarde van 33 keer de positie van het symbool binnen de streepjescode .

FNC4 gebruiken om hoge (128–255) tekens te coderen

Het speciale symbool FNC4 ("Functie 4"), alleen aanwezig in codesets A en B, kan worden gebruikt om alle Latin-1 ( ISO-8859-1 ) tekens in een Code 128-barcode te coderen . De functie wordt niet breed ondersteund en wordt niet gebruikt in GS1-128. Wanneer een enkele FNC4 aanwezig is in een string, wordt het volgende symbool zoals gewoonlijk geconverteerd naar ASCII en vervolgens wordt 128 toegevoegd aan de ASCII-waarde. (Als het volgende symbool een verschuiving is, wordt een tweede symbool gebruikt om het teken te verkrijgen.) Als twee FNC4's achter elkaar worden gebruikt, worden alle volgende tekens als zodanig behandeld, tot aan het einde van de tekenreeks of een ander paar FNC4's . Tussen de dubbele FNC4's wordt een enkele FNC4 gebruikt om aan te geven dat het volgende teken standaard ASCII is .

Breedte streepjescode

Code128 specificeert een combinatie van 6 afwisselende balken en spaties (3 van elk) voor elk symbool. Elk symbool begint dus met een balk en eindigt met een spatie. In barcodelettertypen wordt de laatste balk over het algemeen gecombineerd met het stopsymbool om een ​​breder stoppatroon te maken. In de volgende tabel worden de breedtes beschreven die bij elke balk horen en de spatie voor elk symbool. De breedte van elke balk of ruimte kan 1, 2, 3 of 4 eenheden (modules) zijn. Met behulp van het bovenstaande voorbeeld zou een 'A' worden afgebeeld met het patroon 10100011000, of als breedte 111323 in de onderstaande tabellen.

De waarde voor de breedte wordt afgeleid door de lengte van elke reeks van enen en dan nullen in het patroon te tellen, beginnend vanaf links. Er zullen altijd 6 runs zijn en de lengtes van deze 6 runs vormen de breedtes-waarde. Als u bijvoorbeeld het patroon 10100011000 gebruikt, zijn de runlengtes 1 (cijfer 1), 1 (cijfer 0), 1 (cijfer 1), 3 (cijfer 0), 2 (cijfer 1), 3 (cijfer 0). Het rapporteren van alleen de lengtes van elke run geeft 1, 1, 1, 3, 2, 3, waardoor een breedtewaarde van 111323 wordt geproduceerd.

Code 128
Waarde Hex waarde 128A 128B 128C Lettertypepositie
(algemeen/soms/barcodesoft)
Bar/ruimte
Code Latijn-1 Patroon Breedtes
0 00 ruimte ruimte 00 32 of 194 of 207 / 212 / 252 of  of Ï / Ô / ü 11011001100 212222
1 01 ! ! 01 33 ! 11001101100 222122
2 02 " " 02 34 " 11001100110 222221
3 03 # # 03 35 # 10010011000 121223
4 04 $ $ 04 36 $ 10010001100 121322
5 05 % % 05 37 % 10001001100 131222
6 06 & & 06 38 & 10011001000 122213
7 07 ' ' 07 39 ' 10011000100 122312
8 08 ( ( 08 40 ( 10001100100 132212
9 09 ) ) 09 41 ) 11001001000 221213
10 0a * * 10 42 * 11001000100 221312
11 0b + + 11 43 + 11000100100 231212
12 0c , , 12 44 , 10110011100 112232
13 0d - - 13 45 - 10011011100 122132
14 0e . . 14 46 . 10011001110 122231
15 0f / / 15 47 / 10111001100 113222
16 10 0 0 16 48 0 10011101100 123122
17 11 1 1 17 49 1 10011100110 123221
18 12 2 2 18 50 2 11001110010 223211
19 13 3 3 19 51 3 11001011100 221132
20 14 4 4 20 52 4 1100001110 221231
21 15 5 5 21 53 5 11011100100 213212
22 16 6 6 22 54 6 11001110100 223112
23 17 7 7 23 55 7 11101101110 312131
24 18 8 8 24 56 8 11101001100 311222
25 19 9 9 25 57 9 1110101100 321122
26 1a : : 26 58 : 11100100110 321221
27 1b ; ; 27 59 ; 11101100100 312212
28 1c < < 28 60 < 11100110100 322112
29 1d = = 29 61 = 11100110010 322211
30 1e > > 30 62 > 11011011000 212123
31 1f ? ? 31 63 ? 11011000110 212321
32 20 @ @ 32 64 @ 11000110110 232121
33 21 EEN EEN 33 65 EEN 10100011000 111323
34 22 B B 34 66 B 10001011000 131123
35 23 C C 35 67 C 10001000110 131321
36 24 NS NS 36 68 NS 10110001000 112313
37 25 E E 37 69 E 10001101000 132113
38 26 F F 38 70 F 10001100010 132311
39 27 G G 39 71 G 11010001000 211313
40 28 H H 40 72 H 11000101000 231113
41 29 l l 41 73 l 1100100010 231311
42 2a J J 42 74 J 10110111000 112133
43 2b K K 43 75 K 10110001110 112331
44 2c L L 44 76 L 10001101110 132131
45 2d m m 45 77 m 10111011000 113123
46 2e N N 46 78 N 10111000110 113321
47 2f O O 47 79 O 10001110110 133121
48 30 P P 48 80 P 11101110110 313121
49 31 Q Q 49 81 Q 11010001110 211331
50 32 R R 50 82 R 11000101110 231131
51 33 S S 51 83 S 11011101000 213113
52 34 t t 52 84 t 110111010 213311
53 35 u u 53 85 u 11011101110 213131
54 36 V V 54 86 V 11101011000 311123
55 37 W W 55 87 W 11101000110 311321
56 38 x x 56 88 x 11100010110 331121
57 39 Y Y 57 89 Y 11101101000 312113
58 3a Z Z 58 90 Z 11101100010 312311
59 3b [ [ 59 91 [ 11100011010 332111
60 3c \ \ 60 92 \ 11101111010 314111
61 3d ] ] 61 93 ] 11001000010 221411
62 3e ^ ^ 62 94 ^ 1111000010 431111
63 3f _ _ 63 95 _ 10100110000 111224
64 40 NUL ` 64 96 ` 10100001100 111422
65 41 SOH een 65 97 een 10010110000 121124
66 42 STX B 66 98 B 10010000110 121421
67 43 ETX C 67 99 C 10000101100 141122
68 44 EOT NS 68 100 NS 10000100110 141221
69 45 ENQ e 69 101 e 10110010000 112214
70 46 ACK F 70 102 F 10110000100 112412
71 47 BEL G 71 103 G 10011010000 122114
72 48 BS H 72 104 H 1001100010 122411
73 49 HT l 73 105 l 10000110100 142112
74 4a LF J 74 106 J 10000110010 142211
75 4b VT k 75 107 k 110000010010 241211
76 4c FF ik 76 108 ik 11001010000 221114
77 4d CR m 77 109 m 11110111010 413111
78 4e DUS N 78 110 N 1100010100 241112
79 4f SI O 79 111 O 10001111010 134111
80 50 DLE P 80 112 P 10100111100 111242
81 51 DC1 Q 81 113 Q 10010111100 121142
82 52 DC2 R 82 114 R 10010011110 121241
83 53 DC3 s 83 115 s 10111100100 114212
84 54 DC4 t 84 116 t 10011110100 124112
85 55 NAK jij 85 117 jij 10011110010 124211
86 56 SYN v 86 118 v 11110100100 411212
87 57 ETB met wie 87 119 met wie 11110010100 421112
88 58 KAN x 88 120 x 11110010010 421211
89 59 EM ja 89 121 ja 11011011110 212141
90 5a SUB z 90 122 z 11011110110 214121
91 5b ESC { 91 123 { 11110110110 412121
92 5c FS | 92 124 | 10101111000 111143
93 5d GS } 93 125 } 10100011110 111341
94 5e RS ~ 94 126 ~ 100010111110 131141
95 5f ons DEL 95 195 / 200 / 240 Ã / È / 10111101000 114113
96 60 FNC 3 FNC 3 96 196 / 201 / 241 Ä / É / ñ 10111100010 114311
97 61 FNC 2 FNC 2 97 197 / 202 / 242 / Ê / 1110101000 41113
98 62 Shift B Shift A 98 198 / 203 / 243 Æ / Ë / ó 11110100010 411311
99 63 Code C Code C 99 199 / 204 / 244 Ç / Ì / ô 10111011110 113141
100 64 Code B FNC 4 Code B 200 / 205 / 245 / Í / 10111101110 114131
101 65 FNC 4 Code A Code A 201 / 206 / 246 É / Î / ö 11101011110 311141
102 66 FNC 1 FNC 1 FNC 1 202 / 207 / 247 Ê / Ï / ÷ 11110101110 411131
103 67 Startcode A 203 / 208 / 248 Ë / Ð / ø 11010000100 211412
104 68 Startcode B 204 / 209 / 249 / Ñ / 11010010000 211214
105 69 Startcode C 205 / 210 / 250 Í / Ò / ú 11010011100 211232
106 6a Stop 1100111010 233111
Achteruit stoppen 11010111000 211133
Stoppatroon (7 streepjes/spaties) 206 / 211 / 251 / Ó / 110011101011 2331112

De symbolen "Code A", "Code B" en "Code C" zorgen ervoor dat alle volgende symbolen worden geïnterpreteerd volgens de overeenkomstige subcode (dwz 128A, 128B of 128C). Het "Shift"-symbool schakelt de interpretatie van een enkel volgend symbool tussen subcodes A en B.

Het gecodeerde ASCII-teken is afhankelijk van het daadwerkelijk gebruikte barcode-lettertype. Vooral het ASCII-teken van waarde 0 en van waarde 95 en hoger kan anders worden gedefinieerd in het geïnstalleerde lettertype.

De FNC x- codes worden voor speciale doeleinden gebruikt. FNC1 aan het begin van een streepjescode geeft een GS1-128- streepjescode aan die begint met een 2- 3- of 4-cijferige applicatie-identificatie die is toegewezen door de Uniform Code Council , wat de volgende cijfers verklaart. Toepassings-ID 421 geeft bijvoorbeeld aan dat er een ISO 3166-1 numerieke landcode en verzend-aan postcode volgt. Zo zou de Amerikaanse postcode voor het Witte Huis over het algemeen worden afgedrukt als "(421) 840 20500", maar in werkelijkheid worden gecodeerd als " [Start C] [FNC1] 42 18 40 20 50 [Code A] 16 [Check symbol 92] [Stop]"

Controleer cijferberekening voor het bovenstaande voorbeeld van een postcode:

Waarde Gewicht Gewicht × waarde
Begin 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
Som = 1740
1740 Mod 103 = 92

Beschikbaarheid

Voor de eindgebruiker kunnen Code 128-barcodes worden gegenereerd door een externe toepassing om een ​​afbeelding van de streepjescode te maken, of door een op lettertypen gebaseerde barcode-oplossing. Voor beide oplossingen is het gebruik van een applicatie of een applicatie-invoegtoepassing vereist om het controlecijfer te berekenen en de streepjescode te maken.

Optimalisatie van streepjescodelengte

Codeset C gebruikt één codesymbool om twee cijfers weer te geven, dus als de tekst slechts cijfers bevat, resulteert dit over het algemeen in kortere streepjescodes. Wanneer de tekenreeks echter maar een paar cijfers bevat of wordt gemengd met niet-cijferige tekens, produceert deze niet altijd een compactere code dan codesets A of B. Het gebruik van codeset C bespaart één symbool per twee cijfers, maar kost een modus -shift-symbool om de set in en uit te gaan. Het is dus alleen de moeite waard om te gebruiken als er voldoende opeenvolgende cijfers zijn. Bijvoorbeeld, het coderen van de string "X00Y" met codeset A of B vereist 7 codesymbolen ( [Start B] 56 16 16 57 [checksum] [Stop]), terwijl het gebruik van codeset C voor de "00" zou resulteren in een code van 8 symbolen lang ( [Start B] 56 [Code C] 00 [Code B] 57 [checksum] [Stop]).

Het gebruik van codeset C is alleen voordelig onder de volgende voorwaarden:

Locatie van cijfers Aantal opeenvolgende cijfers
begin van gegevens 4+
einde van gegevens 4+
midden van data (omgeven door symbolen uit codeset A of B) 6+
volledige gegevens ofwel 2 of 4+ (maar niet 3)

Als u aan het einde van een string de overgang naar codeset C uitstelt totdat er een even aantal cijfers over is, wordt een extra symbool vermeden. Beschouw de string "...01234": een vertraagde switch produceert ... 0 [Code C] 12 34 [checksum] [Stop]maar een vroege switch produceert ... [Code C] 01 23 [Code A] 4 [checksum] [Stop].

Bijvoorbeeld, gegeven de string "098x1234567y23", worden besparingen op streepjescodelengte met behulp van codeset C alleen bereikt als deze wordt toegepast op het middelste deel van de string. Voor het begin- en eindgedeelte van de string is overschakelen naar codeset C niet effectief. Omdat er een oneven aantal cijfers in het midden van de string staat, moet de oneven code een andere code gebruiken, ingesteld, maar het maakt niet uit of dit de eerste of de laatste is; In beide gevallen zijn 16 symbolen vereist: [Start B] 0 9 8 x 1 [Code C] 23 45 67 [Code B] y 2 3 [checksum] [Stop], of [Start B] 0 9 8 x [Code C] 12 34 56 [Code B] 7 y 2 3 [checksum] [Stop].

Het optimaliseren van de lengte van de resulterende streepjescode is belangrijk wanneer streepjescodelezers worden gebruikt die het volledige streepjescodebeeld in één keer moeten detecteren om het te kunnen lezen, zoals gewone laserscanners . Hoe langer de streepjescode, hoe groter de afstand van de laserbarcodelezer tot het streepjescodebeeld nodig is, waardoor het lezen moeilijk of onmogelijk wordt boven bepaalde drempellengten/afstanden.

De optimale codering kan worden gevonden met behulp van een dynamisch programmeeralgoritme .

Referenties

Externe links

Voorbeeldcode

  • ZXing - Multiplatform open source barcodescanner / generator met versies beschikbaar in Java ( kernproject ) en poorten naar ActionScript, C++, C#, ObjectiveC en Ruby.
  • Python- streepjescode 128 - Deze code lijkt vakken van één pixel breed te tekenen. Het lijkt erop dat het is gewijzigd van een streepjescode met een korte regel en een lange regel die lijnen zou hebben getrokken. De "zwarte dozen" moeten even groot zijn als de "witte dozen".
  • GenCode128 - Gratis C#-broncode-implementatie van Code128. Vrijwel alle features zijn geïmplementeerd, maar is niet 100% compleet.
  • Barcode1DTools Ruby gem - Ruby-broncode voor vele 1D-barcodesymbologieën, waaronder Code 128.
  • Perl-barcodegeneratiecode - Perl-broncode voor vele 1D-barcodesymbologieën, waaronder Code 128.
  • Barcode::Code128 – Gratis Perl- barcodegeneratiemodule .
  • GOCR - Gratis OCR met Code 128-herkenning.
  • Barcode Code 128 - Gratis JavaScript-broncode-implementatie van Code128.
  • Barcode4J – Gratis Java API met implementatie van Code128 en andere standaard barcodes.
  • JavaScript-code 128 - Open-source JavaScript-implementatie van Code128 en andere lineaire streepjescodes.
  • Introductie van het maken van Code 128-barcodes Gids voor het converteren van tekst naar Code 128-barcodes. Geschreven voor Lazarus (open-source, multi-platform GUI Pascal) maar voor algemeen gebruik.