Koodi 128 - Code 128

Image
Sveitsiläinen postiviivakoodi, joka koodaa "RI 476 394 652 CH" koodissa 128-B

Koodi 128 on ISO/IEC 15417: 2007 -standardissa määritelty suuritiheyksinen lineaarinen viivakoodisymboli . Sitä käytetään aakkosnumeerisiin tai vain numeerisiin viivakoodeihin . Se voi koodata kaikki 128 ASCII- merkkiä ja käyttämällä laajennussymbolia (FNC4) ISO/IEC 8859-1 -standardissa määriteltyjä latina-1-merkkejä . Se johtaa yleensä pienempiin viivakoodeihin verrattuna muihin menetelmiin, kuten koodi 39 , varsinkin kun tekstit sisältävät enimmäkseen numeroita.

GS1-128 (aiemmin tunnettu nimellä UCC/EAN-128) on koodin 128 osajoukko, ja sitä käytetään laajalti maailmanlaajuisesti merenkulku- ja pakkausteollisuudessa tuotekoodina kontin ja kuormalavan tasoille toimitusketjussa.

Erittely

"Koodi 128 osiot"
Viivakoodin kaavio (koodi 128B).
1 : hiljainen vyöhyke, 2 : aloituskoodi, 3 : data, 4 : tarkistussumma, 5 : pysäytyskoodi

Code 128 -viivakoodissa on seitsemän osaa:

  1. Hiljainen alue
  2. Aloitussymboli
  3. Koodatut tiedot
  4. Tarkista symboli (pakollinen)
  5. Stop -symboli
  6. Viimeinen palkki (pidetään usein osana stop -symbolia)
  7. Hiljainen alue

Sekkisymboli lasketaan kaikkien symbolien painotetusta summasta ( modulo 103).

Alatyypit

Koodi 128 sisältää 108 symbolia: 103 datasymbolia, 3 aloitussymbolia ja 2 pysäytyssymbolia. Jokainen symboli koostuu kolmesta mustasta palkista ja kolmesta eri leveydestä olevasta valkoisesta tilasta. Kaikki leveydet ovat perusmoduulin monikertoja. Jokainen palkki ja väli on 1-4 moduulia leveä ja symbolit ovat kiinteää leveyttä: kolmen mustan palkin ja kolmen valkoisen palkin leveyden summa on 11 moduulia.

Pysäytyskuvio koostuu kahdesta päällekkäisestä symbolista ja siinä on neljä palkkia. Pysäytyskuvio mahdollistaa kaksisuuntaisen skannauksen. Kun pysäytyskuvio luetaan vasemmalta oikealle (tavallinen tapaus), pysäytyssymboli (jota seuraa 2-moduulinen palkki) tunnistetaan. Kun pysäytyskuvio luetaan oikealta vasemmalle, peruutuspysäytyssymboli (jota seuraa 2-moduulinen palkki) tunnistetaan. Skannerin, joka näkee peruutuspysäytyssymbolin, tietää sitten, että sen on ohitettava 2-moduulinen palkki ja luettava loput viivakoodista taaksepäin.

Nimestä huolimatta koodissa 128 ei ole 128 erillistä symbolia, joten se ei voi edustaa 128 koodipistettä suoraan. Edustaakseen kaikkia 128 ASCII -arvoa se siirtyy kolmen koodijoukon (A, B, C) välillä. Yhdessä koodijoukot A ja B kattavat kaikki 128 ASCII -merkkiä. Koodijoukkoa C käytetään koodittamaan merkkijonoja tehokkaasti. Ensimmäinen osajoukko valitaan käyttämällä asianmukaista käynnistyssymbolia. Jokaisessa koodijoukossa jotkut 103 datakoodipisteestä on varattu siirtymään toiseen kahdesta koodijoukosta. Vaihdot tehdään käyttämällä koodipisteitä 98 ja 99 koodisarjoissa A ja B, 100 koodisarjoissa A ja C ja 101 koodisarjoissa B ja C vaihtaakseen niiden välillä):

  • 128A (koodijoukko A) - ASCII -merkit 00-95 (0–9, A – Z ja ohjauskoodit), erikoismerkit ja FNC 1–4
  • 128B (koodijoukko B) - ASCII -merkit 32–127 (0–9, A – Z, a – z), erikoismerkit ja FNC 1–4
  • 128C (koodijoukko C) - 00–99 (koodaa kaksi numeroa yhdellä koodipisteellä) ja FNC1

Koodin 128 vasemmalla ja oikealla puolella olevan hiljaisen alueen vähimmäisleveys on 10x, missä x on moduulin vähimmäisleveys. Se on pakollinen viivakoodin vasemmalla ja oikealla puolella.

Käynnistys/pysäytys ja koodatut tiedot

Jokainen viivakoodin symboli koostuu kolmesta palkista ja kolmesta välilyönnistä. Jokainen palkki tai väli on 1, 2, 3 tai 4 yksikköä leveä, palkkien leveyden summan on oltava parillinen (4, 6 tai 8 yksikköä), välileveyden summan on oltava pariton (3, 5 tai 7 yksikköä) ja yhteensä 11 yksikköä symbolia kohden. Esimerkiksi ASCII -merkin "0" koodausta voidaan pitää muodossa 10011101100, jossa 1: n sekvenssi on palkki ja 0: n sekvenssi on välilyönti. Yksi 1 olisi ohuin viiva viivakoodissa. Kolme 1: tä peräkkäin (111) osoittaa palkkia, joka on kolme kertaa paksumpi kuin yksi 1 bar.

Mahdollisia 11 yksikön leveitä symboleja on 108, ja koodi käyttää kaikkia mahdollisia symboleja. Kahta symbolista käytetään pysäytyksen (viivakoodin lopun) osoittamiseen, pysäytykseen ja peruutuspysäytykseen. Kaksi pysäytyssymbolia ovat erityisiä, koska niiden jälkeen on aina 2 yksikön palkki, joka muodostaa 13 yksikön pitkän pysäytyskuvion. Pysäytyskuvion lukeminen vasemmalta oikealle on pysäytyssymboli (jota seuraa 2 yksikön palkki) ja pysäytyskuvion lukeminen oikealta vasemmalle on käänteinen pysäytyssymboli (jota seuraa 2 yksikön palkki).

Tarkista numeroiden laskenta

Tarkistusnumero on painotettu modulo-103-tarkistussumma. Se lasketaan summaamalla aloituskoodin "arvo" kunkin symbolin "arvon" tuotteisiin kerrottuna sen sijainnilla viivakoodijonossa. Aloitussymboli ja ensimmäinen koodattu symboli ovat kohdassa 1. Tuotteiden summa pienennetään sitten modulo 103. Loput muunnetaan sitten takaisin yhdeksi 103: sta rajaamattomasta symbolista ( alla annettujen ohjeiden mukaisesti ) ja liitetään viivakoodiin , juuri ennen pysäytyssymbolia.

Esimerkiksi seuraavassa taulukossa koodin 128 variantin A tarkistussumma lasketaan aakkosnumeeriselle merkkijonolle PJJ123C:

Koodi Arvo Sijainti Arvo ×
sijainti
Aloituskoodi 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
Summa 878
Jäljellä oleva mod 103 54

Tarkistussymbolin laskemiseksi siirto- ja koodikytkimen symboleja käsitellään samalla tavalla kuin mitä tahansa muuta viivakoodin symbolia. Tarkistussumma lasketaan symboliarvojen perusteella riippumatta siitä, mikä koodijoukko on aktiivinen tuolloin. Esimerkiksi koodijoukon C arvoa "33" ja koodijoukon B arvoa "A" pidetään molemmat koodin 128 arvona 33, ja tarkistusnumero lasketaan sen arvon perusteella, joka on 33 kertaa symbolin sijainti viivakoodissa .

FNC4 -koodin käyttäminen korkeiden (128–255) merkkien koodaamiseen

Erikoissymbolilla FNC4 ("toiminto 4"), joka esiintyy vain koodisarjoissa A ja B, voidaan koodata kaikki latinalaisen 1 ( ISO-8859-1 ) merkit Code 128 -viivakoodissa. Ominaisuutta ei tueta laajasti, eikä sitä käytetä GS1-128: ssa. Kun merkkijonossa on yksi FNC4, seuraava symboli muunnetaan ASCII: ksi tavalliseen tapaan ja sitten 128 lisätään ASCII -arvoon. (Jos seuraava symboli on siirtymä, toista merkkiä käytetään merkin saamiseen.) Jos kahta FNC4: ää käytetään peräkkäin, kaikkia seuraavia merkkejä käsitellään sellaisina merkkijonon loppuun asti tai toiseen FNC4 -pariin . Kahden FNC4: n välillä käytetään yhtä FNC4: ää osoittamaan, että seuraava merkki on vakio ASCII .

Viivakoodin leveydet

Code128 määrittää kuuden vuorottelevan palkin ja välilyönnin yhdistelmän (3 kpl) kullekin symbolille. Näin ollen jokainen symboli alkaa palkilla ja päättyy välilyöntiin. Viivakoodifontteissa viimeinen palkki yhdistetään yleensä pysäytyssymboliin laajemman pysäytyskuvion luomiseksi. Seuraavassa taulukossa kuvataan kunkin palkin leveydet ja kunkin symbolin väli. Jokaisen palkin tai tilan leveys voi olla 1, 2, 3 tai 4 yksikköä (moduulia). Yllä olevan esimerkin avulla "A" esitetään kuviolla 10100011000 tai leveyksinä 111323 alla olevissa taulukoissa.

Leveysarvo lasketaan laskemalla mallin jokaisen 1: n ja sitten 0: n ajon pituus vasemmalta alkaen. Ajoja on aina 6 ja näiden kuuden ajon pituudet muodostavat Leveydet -arvon. Esimerkiksi kuvion 10100011000 avulla ajopituudet ovat 1 (numero 1), 1 (numero 0), 1 (numero 1), 3 (numero 0), 2 (numero 1), 3 (numero 0). Kun raportoidaan vain kunkin ajon pituudet, saadaan 1, 1, 1, 3, 2, 3, jolloin saadaan leveysarvo 111323.

Koodi 128
Arvo Hex -arvo 128A 128B 128C Fontin sijainti
(Yleinen/Melko harvinainen/Viivakoodit)
Bar/Space
Koodi Latinalainen-1 Kuvio Leveydet
0 00 tilaa tilaa 00 32 tai 194 tai 207 /212 /252 tai  tai Ï / Ô / ü 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 11001001110 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 11100101100 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 A A 33 65 A 10100011000 111323
34 22 B B 34 66 B 10001011000 131123
35 23 C C 35 67 C 10001000110 131321
36 24 D D 36 68 D 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 Minä Minä 41 73 Minä 11000100010 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 11011100010 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 ^ 11110001010 431111
63 3f _ _ 63 95 _ 10100110000 111224
64 40 NUL ` 64 96 ` 10100001100 111422
65 41 SOH a 65 97 a 10010110000 121124
66 42 STX b 66 98 b 10010000110 121421
67 43 ETX c 67 99 c 10000101100 141122
68 44 EOT d 68 100 d 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 10011000010 122411
73 49 HT i 73 105 i 10000110100 142112
74 4a LF j 74 106 j 10000110010 142211
75 4b VT k 75 107 k 11000010010 241211
76 4c FF l 76 108 l 11001010000 221114
77 4d CR m 77 109 m 11110111010 413111
78 4e NIIN n 78 110 n 11000010100 241112
79 4f SI o 79 111 o 10001111010 134111
80 50 DLE s 80 112 s 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 u 85 117 u 10011110010 124211
86 56 SYN v 86 118 v 11110100100 411212
87 57 ETB w 87 119 w 11110010100 421112
88 58 VOI x 88 120 x 11110010010 421211
89 59 EM y 89 121 y 11011011110 212141
90 5a SUB z 90 122 z 11011110110 214121
91 5b POISTU { 91 123 { 11110110110 412121
92 5c FS | 92 124 | 10101111000 111143
93 5d GS } 93 125 } 10100011110 111341
94 5e RS ~ 94 126 ~ 10001011110 131141
95 5f MEILLE 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 Å / Ê / ò 11110101000 411113
98 62 Vaihto B Vaihto A 98 198 /203 /243 Æ / Ë / ó 11110100010 411311
99 63 Koodi C Koodi C 99 199 /204 /244 Ç / Ì / ô 10111011110 113141
100 64 Koodi B FNC 4 Koodi B 200/205/245 È / Í / õ 10111101110 114131
101 65 FNC 4 Koodi A Koodi A 201 /206 /246 É / Î / ö 11101011110 311141
102 66 FNC 1 FNC 1 FNC 1 202/207/247 Ê / Ï / ÷ 11110101110 411131
103 67 Aloituskoodi A 203/208/248 Ë / Ð / ø 11010000100 211412
104 68 Aloituskoodi B 204/209/249 Ì / Ñ / ù 11010010000 211214
105 69 Aloita koodi C 205/210/250 Í / Ò / ú 11010011100 211232
106 6a Lopettaa - - 11000111010 233111
- - Peruutuspysäkki - - 11010111000 211133
- - Pysäytyskuvio (7 palkkia/välilyöntiä) 206/211/251 Î / Ó / û 1100011101011 2331112

Symbolit "koodi A", "koodi B" ja "koodi C" saavat kaikki seuraavat symbolit tulkitsemaan vastaavan alikoodin mukaisesti (eli 128A, 128B tai 128C). "Shift" -symboli vaihtaa yhden seuraavan symbolin tulkinnan alikoodien A ja B välillä.

Koodattu ASCII-merkki riippuu todellisuudessa käytetystä viivakoodifontista. Erityisesti arvojen 0 ja 95 ja sitä suurempia ASCII -merkkejä voidaan määritellä eri tavalla asennetussa fontissa.

FNC x -koodeja käytetään erityistarkoituksiin. FNC1 viivakoodin alussa osoittaa GS1-128- viivakoodin, joka alkaa Uniform Code Councilin antamalla 2-3- tai 4-numeroisella sovellustunnuksella , joka selittää seuraavat numerot. Esimerkiksi sovellustunniste 421 osoittaa, että seuraa ISO 3166-1 -maakoodikoodi ja lähettäjä-postinumero. Niinpä Yhdysvaltain postinumero varten Valkoinen talo olisi yleensä painetaan "(421) 840 20500", mutta itse asiassa koodataan " " [Start C] [FNC1] 42 18 40 20 50 [Code A] 16 [Check symbol 92] [Stop]

Tarkista numeroiden laskenta yllä olevasta postinumeron esimerkistä:

Arvo Paino Paino × arvo
Käynnistä 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
Koodi A 101 7 707
0 16 8 128
Summa = 1740
1740 Mod 103 = 92

Saatavuus

Loppukäyttäjälle koodin 128 viivakoodit voidaan luoda joko ulkopuolisen sovelluksen avulla viivakoodin kuvan luomiseksi tai kirjasinpohjaisella viivakoodilla. Joko ratkaisu edellyttää sovelluksen tai sovelluksen lisäyksen käyttöä tarkistusnumeron laskemiseksi ja viivakoodin luomiseksi.

Viivakoodin pituuden optimointi

Koodijoukko C edustaa yhtä koodisymbolia kahden numeron esittämiseen, joten kun teksti sisältää vain numeroita, se johtaa yleensä lyhyempiin viivakoodeihin. Kuitenkin, kun merkkijono sisältää vain muutaman numeron tai se on sekoitettu ei-numeroiseen merkkiin, se ei aina tuota kompaktimpaa koodia kuin koodijoukot A tai B. Koodijoukon C käyttäminen säästää yhden symbolin kahta numeroa kohden, mutta maksaa tilan -siirtosymboli sarjaan siirtymiseen ja siitä poistumiseen. Siksi sitä kannattaa käyttää vain, jos peräkkäisiä numeroita on riittävästi. Esimerkiksi merkkijonon "X00Y" koodaaminen koodijoukolla A tai B vaatii 7 koodisymbolia ( [Start B] 56 16 16 57 [checksum] [Stop]), kun taas koodisarjan C käyttäminen "00": lle johtaisi koodin 8 symbolin pituiseen ( [Start B] 56 [Code C] 00 [Code B] 57 [checksum] [Stop]).

Koodijoukon C käyttäminen on edullista vain seuraavissa olosuhteissa:

Numeroiden sijainti Peräkkäisten numeroiden määrä
tietojen alku 4+
tietojen loppu 4+
tietojen keskellä (koodisarjan A tai B symbolien ympäröimänä) 6+
koko data joko 2 tai 4+ (mutta ei 3)

Merkkijonon lopussa viivyttämällä siirtymistä koodijoukkoon C, kunnes jäljellä on parillinen määrä numeroita, vältetään ylimääräinen symboli. Harkitse merkkijonoa "... 01234": viivästetty kytkin tuottaa, ... 0 [Code C] 12 34 [checksum] [Stop]mutta varhainen kytkin tuottaa ... [Code C] 01 23 [Code A] 4 [checksum] [Stop].

Esimerkiksi merkkijonon "098x1234567y23" ansiosta viivakoodin pituutta voidaan säästää koodijoukon C avulla vain, jos sitä käytetään merkkijonon keskiosassa. Merkkijonon alku- ja loppukohdalle siirtyminen koodijoukkoon C ei ole tehokasta. Koska merkkijonon keskellä on pariton määrä numeroita, pariton on käytettävä eri koodia, joka on asetettu, mutta sillä ei ole väliä onko tämä ensimmäinen vai viimeinen; Kummassakin tapauksessa tarvitaan 16 symbolia:, [Start B] 0 9 8 x 1 [Code C] 23 45 67 [Code B] y 2 3 [checksum] [Stop]tai [Start B] 0 9 8 x [Code C] 12 34 56 [Code B] 7 y 2 3 [checksum] [Stop].

Tuloksena olevan viivakoodin pituuden optimointi on tärkeää, kun käytetään viivakoodilukijoita, joiden on tunnistettava koko viivakoodikuva kerralla, jotta ne voidaan lukea, kuten tavalliset laserskannerit . Mitä pidempi viivakoodi on, sitä enemmän laser viivakoodinlukijaa tarvitaan viivakoodikuvasta, mikä tekee lukemisesta vaikeaa tai mahdotonta joidenkin kynnyspituuksien/etäisyyksien yläpuolella.

Optimaalinen koodaus voidaan löytää käyttäen dynaamista ohjelmointia algoritmi.

Viitteet

Ulkoiset linkit

Esimerkkikoodi

  • ZXing - Monitasoinen avoimen lähdekoodin viivakoodinlukija / -generaattori, jonka versiot ovat saatavana Javalla ( ydinprojekti ) ja portit ActionScript-, C ++, C#, ObjectiveC- ja Ruby -versioihin.
  • Python -viivakoodi 128 - Tämä koodi näyttää piirtävän yhden pikselin leveät laatikot. Näyttää siltä, ​​että se on muokattu lyhyen rivin pitkän rivin viivakoodista, joka olisi vetänyt viivoja. "Mustien laatikoiden" tulisi olla samankokoiset kuin "valkoiset laatikot".
  • GenCode128 - Ilmainen C# lähdekoodin toteutus Code128: sta. Lähes kaikki ominaisuudet on toteutettu, mutta se ei ole täysin valmis.
  • Barcode1DTools Ruby -helmi - Ruby -lähdekoodi monille 1D -viivakoodisymboleille, mukaan lukien koodi 128.
  • Perl -viivakoodin generointikoodi - Perl -lähdekoodi monille 1D -viivakoodisymboleille, mukaan lukien koodi 128.
  • Viivakoodi :: Code128 - Ilmainen Perl -viivakoodinmuodostusmoduuli.
  • GOCR - ilmainen tekstintunnistus koodilla 128.
  • Viivakoodikoodi 128 - Code128: n ilmainen JavaScript -lähdekooditoteutus.
  • Barcode4J - Ilmainen Java -sovellusliittymä, jossa on Code128 ja muut tavalliset viivakoodit.
  • JavaScript-koodi 128 -Code128: n ja muiden lineaaristen viivakoodien avoimen lähdekoodin JavaScript-toteutus.
  • Esittelyssä Code 128 -viivakoodien luominen Opas tekstin muuntamiseen Code 128 -viivakoodeiksi. Kirjoitettu Lazarukselle (avoimen lähdekoodin, monialustainen GUI Pascal), mutta yleiseen käyttöön.