Un outil Core, agence digitale à Charleroi
Des QR codes qui se lisent vraiment, fabriqués dans le navigateur.
| Lien, Wi-Fi, contact, texte | Les conventions d'écriture qui font qu'un téléphone propose d'ouvrir, de rejoindre ou d'enregistrer |
| Quatre niveaux de correction | De L à H, avec ce que chacun tolère comme dégâts |
| Couleurs de la marque | Avec un garde-fou : l'outil refuse un contraste qui ne se lira pas |
| Réserve pour un logo | Chiffrée en codets détruits contre codets réparables, pas à l'estime |
| Planche d'autocollants | Une adresse, un numéro de table par étiquette, prête à imprimer en A4 |
| SVG et PNG | Le SVG pour l'imprimeur, le PNG ×12 pour un autocollant de 5 cm |
Aucune donnée ne sort de la machine : ni l'adresse de votre commerce, ni le mot de passe de votre Wi-Fi, ni l'image de votre logo. Ouvrez l'onglet « Réseau » de vos outils de développement, il restera vide.
L'encodeur est celui que Core a écrit pour le système de commande à table du Maharaja, à Charleroi, puis repris pour The Building. Il y avait été vérifié bit à bit contre une implémentation de référence sur 399 charges utiles — mais au seul niveau de correction M, le seul dont ces projets avaient besoin.
L'ouverture aux niveaux L, Q et H est la seule extension apportée pour cette publication. C'est aussi la seule chose qui demandait à être re-vérifiée, et c'est l'objet du harnais de test.
Les tables de la norme ne sont pas recopiées, elles sont déduites. On ne retient que deux nombres par symbole — codets de correction par bloc, et nombre de blocs. Le reste (codets de données, découpage en deux groupes de longueurs différentes) se calcule à partir de la géométrie : surface du symbole, moins les motifs de repérage, les chronomètres, les alignements et les zones réservées. Moins de chiffres recopiés, moins de fautes de frappe possibles.
Le budget d'une réserve centrale se compte en codets, pas en modules. C'est
le piège de ce genre d'outil. Reed-Solomon corrige des octets entiers : un
codet touché par un seul module effacé est perdu au même prix qu'un codet
effacé en entier. Et comme les codets sont posés en zigzag par pavés de 2 × 4
modules, une pastille de côté s en abîme de l'ordre de
(s/2 + 1) × (s/4 + 1). Compté en modules — l'erreur naturelle — un logo de
20 % semble tenir au niveau L, alors qu'il détruit une fois et demie le budget
de correction.
Le contraste est jugé, pas subi. Un code aux couleurs de la marque reste lisible tant que l'écart de luminance est franc. Sous 4:1, l'outil refuse. Et il refuse également les codes inversés — modules clairs sur fond sombre : beaucoup de lecteurs s'en accommodent, aucun ne le garantit.
Un seul <path> pour tous les modules. Un <rect> par module donne un
fichier six fois plus lourd en version 10, et les traceurs d'imprimante
laissent un filet blanc entre les carrés adjacents.
node tests/verifier.js
218 contrôles, dont 92 allers-retours complets. Quatre familles, dont trois indépendantes de l'encodeur :
| Contrôle | Ce qu'il attrape |
|---|---|
| Témoin | La structure déduite doit reproduire à l'identique la table du niveau M déjà vérifiée sur 399 charges utiles. Si la déduction est juste pour M, elle l'est pour L, Q et H. |
| Capacités | Les 40 combinaisons (10 versions × 4 niveaux) doivent retomber sur les capacités publiées par la norme. Ces capacités sont recopiées séparément : une faute dans les tables de correction ne peut pas se compenser dans l'autre. |
| Bourrage | Les bits restants après le dernier codet entier, par version. |
| Aller-retour | Un décodeur écrit pour ce harnais, qui ne partage rien avec l'encodeur, relit chaque symbole : information de format, démasquage, lecture en zigzag, désentrelacement, syndromes de Reed-Solomon, puis comparaison au texte de départ. |
Le décodeur calcule ses syndromes par évaluation en α⁰…α^(n-1) et construit son corps de Galois par tables exponentielle et logarithme ; l'encodeur fait une division polynomiale et multiplie bit à bit. Deux chemins différents vers la même arithmétique : ils se trompent difficilement de la même manière.
Les charges d'essai couvrent les accents, le cyrillique, le japonais, les paires de substitution (🥞), les points-virgules dans un mot de passe Wi-Fi, et les dix versions à chacun des quatre niveaux.
Il s'arrête à la version 10. Soit 271 caractères au niveau L, 119 au niveau H. C'est très au-delà d'une adresse web, et bien assez pour une vCard courte ou un accès Wi-Fi ; ce n'est pas assez pour y loger un menu entier. Les versions 11 à 40 demanderaient 320 nombres recopiés de la norme, que le harnais actuel ne saurait pas vérifier avec la même rigueur — elles viendront le jour où la vérification suivra.
Il n'encode qu'en mode octet. La norme prévoit des modes numérique et
alphanumérique plus compacts. En majuscules, HTTPS://EXEMPLE.BE tiendrait
plus court. L'écart ne devient sensible qu'aux adresses très longues.
Il ne lit pas les QR codes, il n'en fabrique que. Le décodeur du harnais de test suppose un symbole parfait : il vérifie, il ne corrige pas.
Un code valide à l'écran n'est pas un code lisible en salle. Un symbole trop petit, imprimé sur du papier brillant, posé sous un vernis ou collé dans un angle sombre peut refuser de se lire. Imprimez-en un, scannez-le avec deux téléphones, à la lumière du lieu — avant de lancer la planche entière.
Le mot de passe d'un code Wi-Fi est en clair. Quiconque photographie l'autocollant obtient l'accès. Réservez-le au réseau invités, séparé de celui de la caisse.
Téléchargez le dossier et ouvrez index.html. Aucune compilation, aucun
gestionnaire de paquets.
Le moteur s'utilise aussi seul, dans une page ou dans Node :
const CoreQR = require('./js/qr-code.js');
const symbole = CoreQR.encoder('https://core-agency.be', { niveau: 'H' });
// { taille: 33, version: 4, niveau: 'H', masque: 2, modules: [[...]], … }
CoreQR.svg('https://core-agency.be', { niveau: 'Q', sombre: '#6355E0', marge: 4 });
CoreQR.budgetReserve(6, 'H', 0.20); // { codetsDetruits, codetsCorrigibles, tenable }index.html l'atelier
css/qr.css charte Core : violet, lavande, Lexend Deca
js/qr-code.js le moteur ISO/IEC 18004 — autonome, réutilisable seul
js/atelier.js l'interface, les garde-fous, la planche
tests/verifier.js le harnais et son décodeur indépendant
fonts/ Lexend Deca et JetBrains Mono, sous licence OFL
MIT — voir LICENSE.
Construit par Core, agence digitale à Charleroi.