Tastiera e dati in uscita

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.
Cosa succede a FNC1 in base alla posizione
Posizione di FNC1SignificatoCosa trasmette il lettore
Primo carattere del simboloIl 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 variabileFine di quel campoGS (ASCII 29)
Dopo l'ultimo campoNon serveNiente

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:

Cosa può diventare GS in modalità tastiera
Comportamento del lettoreEffetto tipico
Non lo trasmette affattoI 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+29Molte applicazioni Windows mostrano un simbolo grafico (spesso una doppia freccia) ereditato dalla vecchia codepage OEM
Lo sostituisce con un carattere configuratoVisibile 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

  1. 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...".
  2. 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.
  3. 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.
  4. Allinea il software. Il programma che riceve i dati deve sapere quale carattere stai usando come separatore e trattarlo come tale.
  5. 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.

Altro in Tastiera e dati in uscita

Tutta la sezione Tastiera e dati in uscita