# Universal Product Code

L'Universal Product Code (UPC) è una tipologia di codice a barre, largamente usato nel Nord America e in alcune nazioni come il Regno Unito, l'Australia e la Nuova Zelanda per il tracciamento di articoli commerciali nei magazzini.
L'UPC (tecnicamente ci si riferisce ad UPC-A) è composto da 12 cifre numeriche, assegnate in modo univoco a ogni unità commerciale. Assieme al codice a barre EAN, l'UPC è il codice a barre utilizzato principalmente per la scansione di unità commerciali al punto di vendita, secondo le specifiche GS1. Le strutture UPC sono una componente dei GTIN e seguono le specifiche GS1 globali, che si basa su standard internazionali.
Tuttavia alcuni rivenditori (abbigliamento, mobili) non utilizzano il sistema GS1 (utilizzando altre simbologie o sistemi numerici articolo). D'altra parte, alcuni rivenditori utilizzano il codice a barre simbologia EAN / UPC, ma senza usare un GTIN (per prodotti, marchi, venduti a solo alcuni dettaglianti).

## Composizione

Ogni codice a barre UPC-A è costituito da una striscia scansionabile di barre nere e spazi bianchi che contiene una sequenza di 12 cifre numeriche. Non sono ammesse lettere, caratteri. Vi è una corrispondenza univoca tra un numero di 12 cifre e la striscia di barre nere e spazi bianchi, cioè c'è un solo modo per rappresentare un numero di 12 cifre in un UPC e c'è solo un modo per rappresentare una striscia di barre nere e di spazi bianchi in forma numerica.
L'area scansionabile di ciascun codice a barre UPC-A segue il modello SLLLLLLMRRRRRRE, dove i delimitatori S (start), M (medio), ed E (fine) sono rappresentati allo stesso modo su ogni UPC-A e le sezioni L (a sinistra) e R (destra) rappresentano assieme le 12 cifre numeriche che rendono ogni UPC-A unico. La prima cifra L indica un particolare sistema numerico da utilizzare per le cifre seguenti. L'ultima cifra R è una cifra di controllo, che permette di rilevare alcuni errori da scansione o da inserimento manuale. Il modello separa i due gruppi di sei cifre numeriche e ne stabilisce la sequenza.
| UPC-A | UPC-E |
Note: UPC-A 042100005264 è equivalente ad un UPC-E 425261 con il modello di parità "EOEEOO", che è definita da un UPC-A number system 0 and UPC-A check digit 4.

### Formato

I codici a barre UPC-A possono essere stampati in varie densità per essere adattati ad una varietà di processi di stampa e scansione. Il parametro dimensionale significativo è chiamato dimensione-x (larghezza del singolo elemento del modulo). La larghezza di ciascuna barra o spazio è determinata moltiplicando la dimensione-x e la larghezza del modulo (1, 2, 3, o 4 unità) di ciascuna barra o spazio. Ci sono elementi (barre e spazi) che rappresentano l'informazione e altri elementi previsti dallo schema. Poiché lo schema del UPC-A prevede che ciascuna delle 12 cifre sia composta da due barre e due spazi, tutti i codici a barre UPC-A consistono esattamente di (3 × 2) + (12 × 2) = 30 barre, di cui 6 delimitano l'informazione e 24 rappresentano le cifre numeriche.
Per l'UPC-A la dimensione nominale della dimensione-X è 0,33 mm (0.013"). L'altezza nominale del codice a barre per l'UPC-A è 25,9 mm (1,02"). Le barre che formano i delimitatori S (start), M (middle), e E (end), sono estese verso il basso di 5 volte la dimensione-x, con un'altezza nominale del simbolo di 27.55 mm (1.08"). Quest'altezza si applica anche alle barre della prima e dell'ultima cifra del UPC-A. UPC-A possono essere rimpiccioliti o ingranditi dal 80% al 200%.
Per permettere al lettore di codici a barre di lavorare correttamente, a ciascun lato dell'area scansionabile è prevista un'area libera chiamata area di riposo. La sua larghezza deve essere di almeno 9 volte la larghezza della dimensione-x. Per un GTIN-12 codificato in un codice a barre UPC-A, la prima e l'ultima cifra sono sempre posizionate al di fuori del simbolo per delimitare l'area di riposo.

## Codifica

Il codice a barre UPC-A è rappresentato graficamente da una sequenza di barre e spazi, che codificano le 12 cifre numeriche del UPC-A. Ciascuna cifra è rappresentata da 2 barre e 2 spazi. Le barre e gli spazi sono di larghezza variabile, ad esempio 1, 2, 3, o 4 moduli di larghezza. La larghezza totale per ciascuna cifra è sempre 7 moduli, conseguentemente il numero di 12 cifre del UPC-A richiede un totale di 7 x 12 = 84 moduli.
Un UPC-A completo ha una larghezza complessiva pari a: 84 moduli per le cifre numeriche (sezioni L e R) in abbinata a 11 moduli per i delimitatori S (start), M (middle), and E (end). Ciascun delimitatore S (start) e E (end) sono larghi 3 moduli e usano lo schema barra-spazio-barra, dove ciascuna barra e spazio è larga un modulo. Il delimitatore M (middle) è largo 5 moduli ed usa lo schema spazio-barra-spazio-barra-spazio, dove ciascuna barra e spazio è larga un modulo. In aggiunta, un UPC-A necessita di una quiet zone (spazio aggiuntivo largo 9 moduli) prima del delimitatore S (start) e dopo il delimitatore E (end).
Tabella di codifica per i codici a barre UPC-A SLLLLLLMRRRRRRE :
| Area di riposo | S (start) | L (left numerical digit) | L (left numerical digit) | L (left numerical digit) | L (left numerical digit) | L (left numerical digit) | L (left numerical digit) | L (left numerical digit) | L (left numerical digit) | L (left numerical digit) | L (left numerical digit) | M (middle) | R (right numerical digit) | R (right numerical digit) | R (right numerical digit) | R (right numerical digit) | R (right numerical digit) | R (right numerical digit) | R (right numerical digit) | R (right numerical digit) | R (right numerical digit) | R (right numerical digit) | E (end) | Area di riposo |
| Area di riposo | S (start) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | M (middle) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | E (end) | Area di riposo |
Le cifre poste sul lato sinistro del UPC-A (le cifre a sinistra del delimitatore M (middle) ) hanno una larghezza totale delle barre equivalente ad un multiplo della dimensione-X che è un numero dispari. Al contrario le cifre del lato di destra sono di larghezza pari.
Di conseguenza un lettore di codici a barre può determinare se sta scansionando un simbolo da sinistra a destra o da destra a sinistra (il simbolo è capovolto). Dopo aver rilevato un delimitatore S (start) or E (end) (sono tra loro uguali, barra-spazio-barra, indipendentemente dalla direzione di lettura), lo scanner vedrà una lunghezza dispari, se la scansione è da sinistra a destra, o pari per la scansione da destra a sinistra. Attraverso l'informazione parità/direzione, un simbolo capovolto non può confondere lo scanner. Quando ci si imbatte con un simbolo capovolto, lo scanner può semplicemente ignorarlo (molti scanner alternano una scansione sinistra-destra con una destra-sinistra in modo da leggere il simbolo al passaggio successivo) oppure riconoscere la sequenza e metterla nel giusto ordine. C'è un'altra particolarità nella codifica delle cifre. Le cifre del lato destro sono l'inverso ottico delle cifre del lato di sinistra, cioè le barre nere vengono trasformate in spazi bianchi e viceversa. Ad esempio, nel lato sinistro "4" è rappresentato dalla sequenza: lo spazio × 1 - barra × 1 - spazio × 3 - barra × 2. Mentre nel lato destro "4" è barra × 1 - spazio × 1 - barra × 3 - spazio × 2.

## Numerazione

Il numero di codici a barre UPC-A e UPC-E è limitato dagli standards usati per implementarli.
UPC-A: (10^ 6 possibili valori per il lato sinistro) × (10^ 5 possibili valori per il lato destro) = 100 000 000 000.
UPC-E: (10^ 6 possibili valori) × (2 possibili parità per UPC-E number) = 2 000 000.

### Sistema delle cifre numeriche

Qui di seguito descriviamo tutti i possibili sistemi di numerazione delle 12 cifre rappresentate con l'UPC-A. Lo schema LLLLLLRRRRRR, L indica il significato delle cifre seguenti e R rappresenta la cifra di controllo.
* L = 0, 1, 6, 7, 8, 9:
       Usato per la maggior parte dei prodotti. Le cifre LLLLL contengono il codice del produttore (assegnate dal rappresentante locale dell'organizzazione GS1), e le cifre RRRRR sono il codice del prodotto.
* L = 2:
       Riservato per un uso all'interno del punto vendita o del magazzino e per articoli di peso variabile. Per gli articoli di peso variabile come carne, frutta fresca, o verdura, viene assegnato un codice articolo dal negozio se sono confezionati all'interno del negozio. In questi casi, le cifre LLLLL rappresentano il codice articolo, e RRRRR può rappresentare il peso oppure il prezzo, con la prima R si determina quale (0 per il peso).
* L = 3:
       Codici che contengono il National Drug Code(NDC) ovvero l'identificativo per i farmaci negli stati uniti.
* L = 4:
       Riservato per uso locale (negozi/magazzini), utilizzato spesso per carte fedeltà.
* L = 5:
       Buoni d'acquisto. Le cifre LLLLL contengono il codice del produttore, le prime 3 RRR sono il codice della famiglia (impostate dal produttore), e le successive 2 RR è il codice del coupon, che determina l'ammontare dello sconto. questi coupon possono essere doppi o tripli.

### Calcolo della cifra di controllo

Formalmente la cifra di controllo di un UPC-A $x_{12}$ viene determinata risolvendo l'equazione:
    $(3x_{1}+x_{2}+3x_{3}+x_{4}+3x_{5}+x_{6}+3x_{7}+x_{8}+3x_{9}+x_{10}+3x_{11}+x_{12})\equiv 0{\pmod {10}}.$
Generalmente nel sistema UPC-A, la cifra di controllo viene calcolata nel modo seguente:
* Sommare le cifre di posizione dispari (la prima, terza, quinta,..., undicesima cifra).
* Moltiplicare il risultato per 3.
* Al risultato aggiungere le cifre di posizione pari (seconda, quarta, sesta,..., decima).
* Trovare il resto della divisione per 10.
* Se il risultato è diverso da 0, sottrarre il risultato a 10.
Per esempio, nell'UPC-A "03600029145x", dove x è la cifra di controllo da calcolare, x può essere calcolato nel modo seguente:
* sommare le cifre di posizione dispari (0 + 6 + 0 + 2 + 1 + 5 = 14).
* Moltiplicare il risultato per 3 (14 × 3 = 42).
* Aggiungere le cifre di posizione pari (42 + (3 + 0 + 0 + 9 + 4) = 58).
* Calcolare il resto della divisione per 10 (58 mod 10 = 8).
* Se il risultato è diverso da 0, sottrarre il risultato a 10 (10 − 8 = 2).
La cifra di controllo x è 2.
Nota:
* UPC-A può individuare al 100% possibili errori di una cifra.
       Proof:
             Consider check digit equation and fact, that $3\mathbb {Z} _{10}=\mathbb {Z} _{10}$, where $\mathbb {Z} _{10}$ denotes ring of integers modulo 10.
* UPC-A può individuare al 90% errori di inversione. Specialmente, e solo se la differenza tra due cifre adiacenti è 5, UPC-A non può intercettare l'errore di inversione.
             (2) We still have to prove, that UPC-A can detect 90% of transposition errors.
             Let's have a look at the Table of d-transpositions for UPC-A barcodes, where $d\in \{0,1,2,\ldots ,9\}:$
             Table of d-transpositions for UPC-A barcodes 0 1 2 3 4 5 6 7 8 9 N°1 0 0 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 N°2 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 N°3 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 N°4 3 3 3 4 3 5 3 6 3 7 3 8 3 9 N°5 4 4 4 5 4 6 4 7 4 8 4 9 N°6 5 5 5 6 5 7 5 8 5 9 N°7 6 6 6 7 6 8 6 9 N°8 7 7 7 8 7 9 N°9 8 8 8 9 N°10 9 9 Sum 10 18 16 14 12 10 8 6 4 2
             Row Sum contains numbers of d-transpositions, therefore the proportion of non-detectable transposition errors is
             ${\frac {10}{10+18+16+14+12+10+8+6+4+2}}={\frac {10}{100}}=10\%.$

## Varianti

Con UPC, nell'uso comune ci si riferisce tecnicamente al UPC-A.
Esistono altre varianti dell'UPC:
* UPC-B è una versione a 12 cifre dell'UPC senza cifra di controllo, sviluppata per National Drug Code (NDC) and National Health Related Items Code.
* UPC-C è un codice a 12-cifre con il codice di controllo.
* UPC-D è un codice di lunghezza variabile (12 cifre o più) dove la dodicesima è la cifra di controllo. Queste versioni non sono comunemente usate.
* UPC-E è un codice a 6-cifre, che ha il suo equivalente UPC-A a 12 cifre con sistema numerico 0 o 1.
* UPC-2 è un supplemento a 2-cifre al UPC usato per indicare l'edizione di una rivista o di un periodico.
* UPC-5 è un supplemento a 5-cifre al UPC usato per indicare il prezzo consigliato al pubblico per i libri.
Non appena l'UPC diventa tecnologicamente obsoleto, si prevede che UPC-B e UPC-C scompariranno da un uso comune a partire dagli anni 2010. Lo standard UPC-D può essere modificato in EAN 2.0 o gradualmente eliminato del tutto.

### UPC-E

Per permettere l'uso di UPC nei piccoli imballi, dove un codice a 12 cifre non è adatto, fu sviluppata una versione con gli zeri soppressi, chiamata UPC-E, nel cui sistema numerico, tutti gli zeri finali del codice del produttore, e tutti gli zeri iniziali nel codice del prodotto, vengono soppressi (omessi). Questa simbologia differisce dall'UPC-A nella particolarità che vengono usati codici di sole 6 cifre, non viene usato il separatore M (middle), e il separatore E (end) è formato da spazio-barra-spazio-barra-spazio-barra. Il codice a barre UPC-E segue lo schema SDDDDDDE.
Il modo in cui un codice a 6 cifre UPC-E si converte ad un codice a 12 cifre UPC-A, è determinato dal modello numerico della UPC-E e dalla parità. La corrispondenza con un UPC-A si ha solo con il sistema numerico 0 o 1, il cui valore, insieme con l'UPC-A cifra di controllo, determina la parità modello UPC-E della codifica. Con le cifre del codice produttore rappresentate da una X, e le cifre del codice prodotto da N di, allora:
| ultima cifra UPC-E | UPC-E schema numerico | UPC-A equivalente |
| 0 | XXNNN0 | 0 or 1 + XX000-00NNN + check digit |
| 1 | XXNNN1 | 0 or 1 + XX100-00NNN + check digit |
| 2 | XXNNN2 | 0 or 1 + XX200-00NNN + check digit |
| 3 | XXXNN3 | 0 or 1 + XXX00-000NN + check digit |
| 4 | XXXXN4 | 0 or 1 + XXXX0-0000N + check digit |
| 5 | XXXXX5 | 0 or 1 + XXXXX-00005 + check digit |
| 6 | XXXXX6 | 0 or 1 + XXXXX-00006 + check digit |
| 7 | XXXXX7 | 0 or 1 + XXXXX-00007 + check digit |
| 8 | XXXXX8 | 0 or 1 + XXXXX-00008 + check digit |
| 9 | XXXXX9 | 0 or 1 + XXXXX-00009 + check digit |
Per esempio, un UPC-E 654321 può corrispondere al UPC-A 065100004327 oppure 165100004324, depending on the UPC-E parity pattern of the encoded digits, come descritto di seguito:
| UPC-A check digit | UPC-E parity pattern for UPC-A number system 0 | UPC-E parity pattern for UPC-A number system 1 |
| 0 | EEEOOO | OOOEEE |
| 1 | EEOEOO | OOEOEE |
| 2 | EEOOEO | OOEEOE |
| 3 | EEOOOE | OOEEEO |
| 4 | EOEEOO | OEOOEE |
| 5 | EOOEEO | OEEOOE |
| 6 | EOOOEE | OEEEOO |
| 7 | EOEOEO | OEOEOE |
| 8 | EOEOOE | OEOEEO |
| 9 | EOOEOE | OEEOEO |
Tabella di codifica per i codici a barre UPC-E SDDDDDDE :
| S (start) | O (odd parity digit) | O (odd parity digit) | O (odd parity digit) | O (odd parity digit) | O (odd parity digit) | O (odd parity digit) | O (odd parity digit) | O (odd parity digit) | O (odd parity digit) | O (odd parity digit) | E (even parity digit) | E (even parity digit) | E (even parity digit) | E (even parity digit) | E (even parity digit) | E (even parity digit) | E (even parity digit) | E (even parity digit) | E (even parity digit) | E (even parity digit) | E (end) |
| S (start) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | E (end) |
| | 3-2-1-1 | 2-2-2-1 | 2-1-2-2 | 1-4-1-1 | 1-1-3-2 | 1-2-3-1 | 1-1-1-4 | 1-3-1-2 | 1-2-1-3 | 3-1-1-2 | 1-1-2-3 | 1-2-2-2 | 2-2-1-2 | 1-1-4-1 | 2-3-1-1 | 1-3-2-1 | 4-1-1-1 | 2-1-3-1 | 3-1-2-1 | 2-1-1-3 | |
UPC-E 654321 with "EOEOEO" parity pattern (UPC-A 065100004327) would be encoded as
1-1-1 4-1-1-1 1-2-3-1 2-3-1-1 1-4-1-1 2-2-1-2 2-2-2-1 1-1-1-1-1-1.

### EAN-13

L'EAN-13 fu sviluppato come un super set di UPC-A, aggiungendo una cifra aggiuntiva all'inizio di ogni codice UPC-A. Questo espanse i valori unici teorici di 10 volte. L'EAN-13 indica anche il paese di origine dell'azienda che produce l'articolo: le tre cifre iniziali del codice determinano questo, in accordo ai codice di paese GS1. Ogni codice UPC-A può essere facilmente convertito all'equivalente EAN-13 anteponendo la cifra 0 al codice UPC-A. Questa operazione non fa cambiare la cifra di controllo. Tutti i punti di vendita possono capire entrambi.
EAN-8 è una variante a 8 cifre del codice a barre EAN.
Note di utilizzo UPC:
* Tutti i prodotti identificati con un EAN, sono attualmente accettati anche in Nord America - oltre a quelli già segnati con un UPC.
* Prodotti con un UPC preesistente non devono essere ricatalogati con un EAN.
* In Nord America, gli EAN aggiungono del 40% i codici disponibili, principalmente aggiungendo le cifre '10 o 12' alle cifre UPC '00 through 09'. Questo è un potente incentivo per eliminare gradualmente il UPC.