Chiunque abbia generato codici QR si è imbattuto in questo enigma: il contenuto non è lungo, eppure il codice esce così denso che è difficile da distinguere — mentre il codice di un altro, che rimanda a un URL piuttosto lungo, sembra molto più rado.
Il motivo è che un codice QR ha internamente quattro diverse modalità di codifica. Tipi diversi di caratteri prendono canali diversi, e lo spazio che occupano può variare di parecchie volte. Capito questo, si può controllare deliberatamente la densità di un codice.
Quattro modalità di codifica: la stessa informazione, dimensioni molto diverse
I codici QR offrono codifiche dedicate per diversi tipi di caratteri, ciascuna con una diversa «efficienza di impacchettamento»:
| Modalità | Caratteri | Bit per carattere | Efficienza relativa |
|---|---|---|---|
| Numerica | 0-9 | circa 3,33 bit | Massima (40% risparmiato) |
| Alfanumerica | 0-9 A-Z spazio $%*+-./: | circa 5,5 bit | Alta |
| Byte | Tutto il resto (incluso il cinese) | 8 bit | Di base |
| Kanji | Kanji Shift-JIS | 13 bit | Leggermente meglio per CJK comuni |
Il punto chiave: un carattere cinese occupa 3 byte in UTF-8, cioè 24 bit, mentre una lettera latina occupa 1 byte (8 bit). Quindi per gli stessi «20 caratteri» il cinese ha bisogno di 480 bit e l'inglese solo di 160 — una differenza di 3 volte.
È la ragione più diretta per cui i codici QR cinesi risultano più densi.
La modalità kanji aiuta un po', a certe condizioni
Lo standard QR include una «modalità kanji» dedicata in cui ogni carattere occupa solo 13 bit — quasi la metà dei 24 della modalità byte. Sembra ottimo, ma ha una restrizione rigida: supporta solo i caratteri che esistono nella codifica Shift-JIS.
Shift-JIS è una codifica giapponese, e l'insieme di caratteri che copre non coincide del tutto con GB2312 o Unicode. Quindi:
- Molti caratteri cinesi comuni la incontrano e risparmiano spazio;
- Alcuni caratteri semplificati, caratteri rari e tutti i caratteri non cinesi (punteggiatura cinese, emoji) ricadono nella modalità byte;
- Il generatore deve passare intelligentemente tra le due modalità, altrimenti si risparmia pochissimo.
In pratica molti generatori usano la modalità byte dall'inizio alla fine per garantire compatibilità e correttezza. Il risultato è che il contenuto cinese viene contato tutto a 24 bit per carattere e il codice risulta denso.
Un consiglio pratico lungo la strada: anche la punteggiatura cinese occupa 3 byte. Il punto a larghezza piena 。, la virgola ,e la virgola di enumerazione 、sono tutti a larghezza piena e occupano 3 byte ciascuno. Se il vostro contenuto è ricco di punteggiatura, provate a passare alla punteggiatura a mezza larghezza per recuperare un po' di spazio.
Livello di correzione degli errori: la ridondanza compra tolleranza
L'altro punto in cui un codice QR spende spazio è il codice di correzione degli errori. Usa la codifica Reed-Solomon per aggiungere ridondanza ai dati, così che anche se parte del pattern è sporca il contenuto originale possa comunque essere recuperato. Quattro livelli:
- Livello L: circa 7% di ridondanza, recupera all'incirca il 7% di danno
- Livello M: circa 15% (il valore predefinito più comune)
- Livello Q: circa 25%
- Livello H: circa 30%, la tolleranza massima
Quella ridondanza occupa spazio reale. Alla versione 10 (57×57 moduli) il livello L contiene 271 byte mentre il livello H ne contiene solo 119 — quasi il 56% in meno.
Quindi se il vostro codice deve essere scansionato solo da uno schermo, L o M bastano ampiamente, e il pattern sarà notevolmente più rado e facile da scansionare. Ricorrete a Q o H solo quando il codice deve essere stampato su qualcosa che può usurarsi, o quando un logo va al centro.
È esattamente così che funziona un logo centrale: l'area coperta viene trattata come danno e recuperata dal 30% di ridondanza del livello H. Mettete un logo su un codice di livello L e sostanzialmente non si scannerà.
Versione: la «classe di dimensione» di un codice QR
Ci sono 40 versioni in tutto, e la versione n ha una lunghezza del lato di 4n + 17 moduli:
- Versione 1: 21 × 21
- Versione 2: 25 × 25
- Versione 10: 57 × 57
- Versione 20: 97 × 97
- Versione 40: 177 × 177
La capacità sale da qualche decina di byte alla versione 1 fino a 2.953 byte alla versione 40 (livello L, modalità byte). Il generatore sceglie la versione più piccola che contiene il vostro contenuto.
Due cose meritano nota qui:
- Il numero di moduli cresce con il quadrato del lato. Passando dalla versione 20 alla 40 il lato non arriva a raddoppiare, ma il numero di moduli si moltiplica per 3,3. Quindi un codice di versione alta finisce con moduli singoli molto piccoli.
- Moduli troppo piccoli non si scansionano. In teoria ogni modulo ha bisogno di almeno 2-3 pixel per un riconoscimento stabile. Se il vostro contenuto spinge la versione oltre la 20 e la dimensione di stampa è modesta, in pratica potrebbe benissimo risultare illeggibile.
Conclusioni pratiche: rendere il codice QR più facile da scansionare
Per ottenere un codice sia chiaro sia facile da scansionare, ottimizzate in questo ordine:
- Accorciate il contenuto. È di gran lunga la leva più efficace. URL più corti, meno parametri e un reindirizzamento tramite link breve nel mezzo sono l'approccio abituale. Dimezzate il contenuto e la versione può calare di parecchi livelli.
- Abbassate il livello di correzione degli errori. Usate L o M per la visualizzazione a schermo invece di scegliere d'istinto H. I livelli alti valgono solo quando un logo va incorporato o il codice è stampato su un materiale che si usura.
- Preservate la zona di quiete. Un codice QR ha bisogno di un margine libero largo almeno quattro moduli su tutti i lati — la zona di quiete — che l'algoritmo di riconoscimento usa per trovare il bordo del codice. Tagliarla via è la causa numero uno dei fallimenti di scansione, più comune persino della sfocatura.
- Concedete abbastanza pixel. Almeno 4 pixel per modulo è l'obiettivo sicuro, quindi la versione 10 (57 moduli) richiede almeno 228 pixel di larghezza.
- Non usate una piccola immagine raster. Se dovete incorporare un codice in un'immagine, esportate a risoluzione sufficiente o usate un formato vettoriale (SVG) così che il ridimensionamento non lo sfoci.
Come capire quanto è denso il vostro codice
Due approcci:
Primo: osservate il numero di versione che lo strumento riporta quando generate — più bassa è la versione, più facile è la scansione. Se usate il generatore di codici QR, mostra la versione e il numero di byte che il vostro contenuto occupa, così potete modificare il contenuto e osservare la versione cambiare, prendendo confidenza con l'idea che «togliere questi pochi caratteri fa scendere di una versione».
Secondo: portate un codice esistente al decodificatore di codici QR e controllatene versione, livello di correzione degli errori e tipo di contenuto. Se trovate un contenuto apparentemente lungo in una versione bassa, probabilmente il contenuto contiene un link breve.
Entrambi gli strumenti girano localmente nel browser; le immagini che generate e caricate non passano mai da un server.
In una frase
La densità di un codice QR = byte del contenuto ÷ efficienza di codifica + ridondanza della correzione degli errori. Il cinese conta 3 byte, e così la punteggiatura cinese, ed è per questo che i codici cinesi sono naturalmente più densi. Per renderne uno più rado, le mosse più efficaci sono meno contenuto e un livello di correzione più basso, non un generatore diverso.