Perché i QR code in cinese occupano più spazio di quelli in inglese?

Gli stessi pochi caratteri: il QR code in cinese appare denso, quello in inglese molto più arioso. Non è un'illusione: dipende dalle regole di codifica.

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
Numerica0-9circa 3,33 bitMassima (40% risparmiato)
Alfanumerica0-9 A-Z spazio $%*+-./:circa 5,5 bitAlta
ByteTutto il resto (incluso il cinese)8 bitDi base
KanjiKanji Shift-JIS13 bitLeggermente 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.

Strumenti correlati