Il carattere GS e FNC1: perché sparisce nei codici GS1 e come renderlo visibile
FNC1 è un carattere speciale dei codici GS1-128, GS1 DataMatrix e GS1 QR: all'inizio dice "questo è un codice GS1", in mezzo separa un campo a lunghezza variabile dal successivo. Il lettore trasmette il separatore come GS, il carattere ASCII 29, che non ha un tasto: in Excel e nel Blocco note sparisce, e i campi si fondono. Lo rendi visibile facendolo sostituire dal lettore con un carattere stampabile.
FNC1 e GS: due nomi per due livelli
- FNC1 (Function 1) esiste solo dentro il simbolo: è un codice speciale della simbologia, non un carattere ASCII.
- GS (Group Separator, ASCII 29, esadecimale
1D) è il carattere con cui il lettore rappresenta FNC1 nei dati trasmessi, quando FNC1 fa da separatore.
| Posizione di FNC1 | Significato | Cosa trasmette il lettore |
|---|---|---|
| Primo carattere del simbolo | Il codice è GS1 (GS1-128, GS1 DataMatrix, GS1 QR) | Niente nei dati; lo indica l'identificatore AIM (]C1, ]d2, ]Q3), se attivato |
| Dopo un campo a lunghezza variabile | Fine di quel campo | GS (ASCII 29) |
| Dopo l'ultimo campo | Non serve | Niente |
Le parentesi che vedi sotto il codice, come (01) o (10), sono solo testo leggibile per le persone: non sono nel simbolo e il lettore non le trasmette.
Perché il separatore è indispensabile
Alcuni Application Identifier hanno lunghezza fissa: (00) SSCC 18 cifre, (01) GTIN 14 cifre, (11) data di produzione e (17) scadenza nel formato AAMMGG. Altri sono variabili: (10) lotto, (21) seriale, i prezzi (392n). Dopo un campo variabile, se ne segue un altro, serve il separatore per sapere dove finisce. Esempio:
Etichetta: (01)08001234567897(10)LOTTO42(21)12345
Trasmesso: 0108001234567897 10LOTTO42 [GS] 2112345 (spazi aggiunti per leggibilità)
Byte reali: 0108001234567897 10LOTTO42 1D 2112345
Senza GS: 010800123456789710LOTTO422112345
-> lotto interpretato come "LOTTO422112345", seriale perso
Per questo, quando il separatore sparisce, il problema non è estetico: il dato diventa ambiguo. Una buona pratica nella composizione delle etichette è mettere i campi a lunghezza fissa per primi e un solo campo variabile alla fine, così il separatore non serve. Ma le etichette che ricevi dai fornitori, e i Data Matrix sui farmaci con lotto e seriale, il separatore lo usano spesso. La struttura degli AI è spiegata in GS1-128 e Application Identifier.
Perché sparisce in Excel e nel Blocco note
In emulazione tastiera il lettore deve trasformare ogni carattere in tasti. Per GS non esiste un tasto. A seconda del modello e della configurazione succede una di queste cose:
| Comportamento del lettore | Effetto tipico |
|---|---|
| Non lo trasmette affatto | I campi si fondono, nessun indizio visibile |
| Lo trasmette come combinazione Ctrl+] (convenzione dei caratteri di controllo) | Blocco note ed Excel la ignorano; alcune applicazioni la interpretano come scorciatoia. Con PC in layout italiano, il tasto corrispondente è quello del +, e la combinazione può per esempio attivare lo zoom nel browser |
| Lo trasmette in modalità ALT come Alt+29 | Molte applicazioni Windows mostrano un simbolo grafico (spesso una doppia freccia) ereditato dalla vecchia codepage OEM |
| Lo sostituisce con un carattere configurato | Visibile e gestibile: è la soluzione consigliata |
Anche quando il carattere 29 arriva davvero in una cella di Excel (per esempio incollando da un programma seriale), resta invisibile: la cella sembra contenere la stringa senza separatore, ma il carattere c'è e fa fallire confronti e ricerche. La formula =CODICE(STRINGA.ESTRAI(A1;n;1)) ti permette di controllare il codice di un singolo carattere in posizione n.
Per vedere senza dubbi cosa trasmette il tuo lettore, leggi il codice nel test del lettore, che mostra i caratteri invisibili e i loro codici ASCII. Per i significati degli altri caratteri di controllo vedi la tabella dei caratteri di controllo ASCII.
Come mappare GS a un carattere visibile
- Cerca nel manuale l'opzione dedicata. Molti lettori hanno un'impostazione per la trasmissione di FNC1 o per la sostituzione del carattere GS; su altri si ottiene con una regola di formattazione dei dati del tipo "sostituisci ASCII 29 con...".
- Scegli un carattere che non può comparire nei dati GS1. Il set di caratteri ammesso nei valori degli AI (definito nelle GS1 General Specifications) non include, per esempio,
|,#e~. Così sei certo che quel carattere sia sempre un separatore. - Verifica che il carattere sia digitabile con il layout del PC. La tilde
~non è presente sulla tastiera italiana standard;|e#sì. Se il lettore usa il layout USA su PC italiano,|arriva come§e#come£: imposta prima la tastiera italiana. - Allinea il software. Il programma che riceve i dati deve sapere quale carattere stai usando come separatore e trattarlo come tale.
- Prova con un'etichetta reale che contenga almeno un campo variabile seguito da un altro campo, e controlla l'interpretazione con il decodificatore GS1.
Prima: 010800123456789710LOTTO422112345 Dopo: 010800123456789710LOTTO42|2112345
Alternative alla sostituzione
- Porta COM virtuale o seriale: i byte arrivano intatti, GS compreso. È la scelta naturale per software di magazzino e farmacia che elaborano dati GS1. Vedi USB HID o porta COM virtuale.
- Estrazione nel lettore: se ti serve solo il GTIN o solo il lotto, fai trasmettere al lettore solo quel campo.
- HID POS o SDK del produttore: per applicazioni sviluppate su misura che devono ricevere il dato esatto.
RS ed EOT: quando compaiono anche loro
Alcuni codici 2D, specie in ambito industriale e logistico, usano il formato di messaggio ISO/IEC 15434, che racchiude i dati tra un'intestazione [)> e separatori RS (ASCII 30), GS (ASCII 29) e un terminatore EOT (ASCII 4). In emulazione tastiera valgono le stesse difficoltà di GS, con un rischio in più: EOT come Ctrl+D può attivare scorciatoie in alcuni programmi. Se lavori con questi codici, la porta seriale è quasi sempre la scelta giusta.
Caso tipico: una farmacia raccoglie in Excel i Data Matrix delle confezioni per un controllo di lotti e scadenze. Nelle celle lotto e seriale risultano attaccati e il filtro per lotto non trova nulla. Configurato il lettore per sostituire GS con |, una semplice divisione in colonne sul carattere | separa i campi in modo affidabile. Contesto in lettore per farmacia.
Domande frequenti
Perché il mio lettore trasmette "]C1" all'inizio?
È l'identificatore di simbologia AIM attivato come prefisso: dice che il codice è un GS1-128 (Code 128 con FNC1 iniziale). Se il software non lo usa, disattivalo.
Posso stampare un GS1-128 scrivendo le parentesi nel generatore?
Le parentesi servono solo al generatore per capire dove iniziano gli AI; un buon generatore inserisce FNC1 al posto giusto. Verifica poi la lettura con il test.
GS è lo stesso carattere in tutti i codici GS1?
Sì: in GS1-128, GS1 DataMatrix, GS1 QR e GS1 DataBar Expanded il separatore trasmesso è sempre ASCII 29.
Fonti e riferimenti
- GS1 General Specifications (FNC1, Application Identifier, set di caratteri), gs1.org e GS1 Italy.
- ISO/IEC 15417 (Code 128), ISO/IEC 16022 (Data Matrix), ISO/IEC 18004 (QR Code), ISO/IEC 15434 (sintassi dei messaggi), iso.org.
- Product Reference Guide dei produttori, sezioni su FNC1 e caratteri di controllo: Honeywell, Zebra, Datalogic.