Code 128 vs Code 39 : Quelle symbologie de code-barres choisir ?
Écrit par Tomasz Lichosik
Prêt à générer des codes-barres ?
Créez des étiquettes de haute qualité en quelques secondes.
Lors de la mise en place d'un système d'inventaire ou de logistique interne, vous êtes souvent confronté au choix entre deux symbologies classiques : le Code 128 et le Code 39. Toutes deux sont linéaires, toutes deux acceptent lettres et chiffres, et au premier coup d'œil elles semblent interchangeables. Elles ne le sont pas — et un mauvais choix se manifeste plus tard sous forme d'étiquettes trop larges, de lectures qui échouent ou d'une intégration qui demande plus d'attention que prévu.
Les codes linéaires (1D) restent le socle du suivi physique. Contrairement au QR Code ou au DataMatrix, qui exigent un lecteur à imagerie, un code linéaire se lit avec un simple laser bon marché. Si vous étiquetez des bacs de stockage, marquez des immobilisations ou organisez des rayonnages, la décision se ramène presque toujours à ces deux standards industriels.
Cet article ne se contente pas de citer les chiffres habituels : toutes les largeurs ci-dessous ont été mesurées sur le générateur qui fait tourner ce site, symbole par symbole. Deux des affirmations que cette page répétait auparavant n'y ont pas survécu.
1. Code 39 : le pionnier des standards industriels
Introduit en 1974 par Intermec, le Code 39 (aussi écrit « 3 of 9 ») fut le premier code-barres alphanumérique. Son nom décrit sa structure : chaque caractère se compose de neuf éléments — barres et espaces — dont exactement trois sont larges.
Nous l'avons vérifié sur le symbole le plus court possible, un seul caractère de données. Le symbole complet contient alors trois caractères (start *, la donnée, stop *) : le générateur produit 29 éléments, dont 9 larges — soit exactement 3 × 9 éléments avec 3 × 3 éléments larges, plus les espaces inter-caractères. Le rapport large/étroit mesuré est de 3:1, dans la plage autorisée par la norme (2:1 à 3:1).
Jeu de caractères et limites
Dans sa version de base, le Code 39 est auto-vérifiant et couvre 43 caractères :
- Les lettres majuscules
AàZ - Les chiffres
0à9 - Quelques symboles : espace,
-,.,$,/,+,% - L'astérisque (
*), réservé aux marqueurs de début et de fin. Les lecteurs ne le transmettent pas au système : il sert uniquement à repérer où le code commence et se termine.
Il existe une variante étendue « Full ASCII » capable d'encoder les minuscules et le reste des 128 caractères ASCII, mais elle procède en associant deux caractères standard pour chacun (un « a » minuscule devient +A).
Le coût mesuré de cette astuce : six lettres majuscules occupent 127 X, les six mêmes lettres en minuscules via Full ASCII en occupent 223 X, soit 1,76 fois plus large. Le facteur n'est pas exactement 2 parce que la surcharge fixe de début et de fin n'est pas doublée — mais au niveau des caractères, le doublement, lui, est exact.
2. Code 128 : le standard moderne de la performance
Conçu en 1981 par Computer Identics, le Code 128 visait précisément à corriger le problème de taille du Code 39, tout en ajoutant un contrôle d'erreur plus solide et la prise en charge complète du clavier.
ASCII complet et jeux partiels
Le Code 128 encode les 128 caractères ASCII — minuscules, ponctuation, et jusqu'aux caractères de contrôle. Il y parvient sans gonfler le symbole grâce à trois jeux de caractères (A, B et C) entre lesquels il bascule au milieu du code :
- Jeu A — chiffres, majuscules et caractères de contrôle.
- Jeu B — chiffres, majuscules, minuscules et ponctuation standard.
- Jeu C — paires numériques. Au lieu d'un chiffre par symbole, il encode deux chiffres dans un seul motif.
La formule de largeur, mesurée
C'est ici que la comparaison devient concrète. En mesurant des symboles de longueurs croissantes, la largeur des deux symbologies suit une droite parfaite :
| Symbologie | Largeur du symbole (en modules X) |
|---|---|
| Code 39 | 31 X + 16 X × nombre de caractères |
| Code 128 | 35 X + 11 X × nombre de caractères |
Les 16 X du Code 39 se décomposent exactement : 6 éléments étroits (6 X) + 3 éléments larges (9 X) + 1 X d'espace inter-caractères. Le Code 128, lui, facture toujours 11 modules par caractère, quel que soit son contenu.
Sa surcharge fixe est plus élevée — 35 X, soit trois caractères complets dont aucun ne transporte vos données : le caractère de début (11 X), la somme de contrôle Modulo 103 (11 X) et le caractère de fin (13 X). Le Code 39 démarre plus bas (31 X) mais paie chaque caractère bien plus cher.
3. « 30 à 50 % plus étroit » : ce que la mesure dit vraiment
Cette phrase circule partout, et cette page la répétait aussi. Elle est fausse telle quelle : elle ne vaut que pour un type de données bien précis.
Chaîne alphanumérique (jeu B)
| Caractères | Code 39 | Code 128 | Gain |
|---|---|---|---|
| 4 | 95 X | 79 X | 17 % |
| 6 | 127 X | 101 X | 20 % |
| 8 | 159 X | 123 X | 23 % |
| 10 | 191 X | 145 X | 24 % |
| 15 | 271 X | 200 X | 26 % |
| 20 | 351 X | 255 X | 27 % |
Même à 20 caractères, l'écart plafonne à 27 % — en dessous de la borne basse annoncée.
Chaîne purement numérique (jeu C)
| Chiffres | Code 39 | Code 128 | Gain |
|---|---|---|---|
| 4 | 95 X | 57 X | 40 % |
| 6 | 127 X | 68 X | 47 % |
| 8 | 159 X | 79 X | 50 % |
| 10 | 191 X | 90 X | 53 % |
| 15 | 271 X | 134 X | 51 % |
| 20 | 351 X | 145 X | 59 % |
C'est là que la promesse tient — et la dépasse. La raison est directe : en jeu C, un chiffre coûte 5,5 X contre 16 X en Code 39, soit près de trois fois moins.
Ce qu'il faut retenir : l'écart dépend d'abord de la nature de vos données, ensuite de leur longueur. Un identifiant alphanumérique ne vous fera pas économiser la moitié de votre étiquette.
4. Le détail contre-intuitif : un chiffre de plus peut rétrécir le code
En vérifiant le tableau ci-dessus, une anomalie est apparue : le gain à 15 chiffres (51 %) est inférieur à celui à 10 chiffres (53 %). Ce n'est pas une erreur de mesure.
Le jeu C encode les chiffres par paires. Un nombre impair de chiffres ne rentre pas dans les paires : le générateur doit changer de jeu pour le dernier chiffre, et le paie au prix d'un caractère entier.
| Chiffres | Code 128 | Variation |
|---|---|---|
| 12 | 101 X | — |
| 13 | 123 X | +22 X |
| 14 | 112 X | −11 X |
| 15 | 134 X | +22 X |
| 16 | 123 X | −11 X |
Lisez la troisième ligne : un code à 14 chiffres est plus étroit qu'un code à 13 chiffres. Ajouter un chiffre — un zéro non significatif en tête, par exemple — fait gagner 11 X de largeur.
Ce n'est pas un cas d'école. Le format numérique le plus répandu dans le commerce, le GTIN à 13 chiffres, tombe précisément dans ce piège : c'est un nombre impair, et il paie la pénalité.
5. Comparaison technique directe
| Caractéristique | Code 39 | Code 128 |
|---|---|---|
| Année d'introduction | 1974 | 1981 |
| Largeur par caractère | 16 X | 11 X (5,5 X par chiffre en jeu C) |
| Surcharge fixe | 31 X | 35 X |
| Jeu de caractères | Majuscules, chiffres, 7 symboles | ASCII complet, minuscules incluses |
| Compression numérique | Aucune | Oui — deux chiffres par symbole |
| Auto-vérification | Oui | Oui |
| Somme de contrôle | Optionnelle (Modulo 43) | Obligatoire (Modulo 103) |
| Secteurs typiques | Défense, automobile, électronique | Logistique (GS1), entreposage, expédition |
| Risque de lecture erronée | Faible mais réel | Extrêmement faible |
6. Deux exemples qui closent le débat
Prenons deux identifiants que l'on rencontre tous les jours.
Un code d'emplacement, REG-A1 (6 caractères alphanumériques) :
Code 39 = 127 X · Code 128 = 101 X · gain : 20 %. Réel, mais pas décisif. Si votre parc de lecteurs est ancien, ce n'est pas ce chiffre qui doit emporter la décision.
Un numéro d'article, 4006381333931 (13 chiffres) :
Code 39 = 239 X · Code 128 = 123 X · gain : 49 % (et non ~55 %, à cause du nombre impair de chiffres vu plus haut).
Traduit en millimètres sur une imprimante thermique 203 dpi, avec un module X de 0,250 mm (2 points) :
- En Code 39 : 59,8 mm
- En Code 128 : 30,8 mm
- Différence : 29,0 mm
Presque trois centimètres sur une seule étiquette. C'est la différence entre tenir sur un support de 40 mm et devoir en commander un plus large.
7. Quand choisir l'un ou l'autre
Le Code 39 garde du sens quand :
- Votre matériel est ancien. Anciens systèmes d'inventaire, crayons lecteurs, machines sans firmware de décodage moderne : tous lisent le Code 39 sans difficulté, car il est très simple à décoder.
- Vos codes sont courts et alphabétiques. Un code de bac
REG-A1ou de salleSAL-102reste d'une longueur raisonnable, et vous n'avez pas à vous soucier de la somme de contrôle. - Votre logiciel est rudimentaire. Si vous imprimez depuis une police de code-barres en entourant simplement la chaîne d'astérisques (
*REG101*), le Code 39 s'intègre sans bibliothèque de calcul.
Le Code 128 est le meilleur choix par défaut quand :
- La place manque. Petits objets, flacons, immobilisations, étiquettes de documents : la mise en page compacte économise du support.
- Vos données sont longues ou numériques. C'est le seul cas où l'écart dépasse réellement 50 %. Et pensez à la parité du nombre de chiffres.
- Vous avez besoin de minuscules ou de ponctuation. En Code 39, la même chaîne devient 1,76 fois plus large ; en Code 128, elle est 55 % plus étroite que son équivalent Full ASCII.
- Une lecture erronée coûte cher. En pharmacie, en logistique de valeur ou en tri express, la somme Modulo 103 obligatoire est une assurance bon marché.
Conclusion
Le Code 39 reste un pionnier robuste et simple, encore justifié dans les environnements hérités, militaires et industriels fermés. Pour la logistique générale, l'expédition et la majorité des inventaires d'entreprise, le Code 128 est le standard à retenir : plus dense, ASCII complet, et contrôlé par somme obligatoire.
Mais retenez surtout la nuance que la mesure a révélée : son avantage de densité vaut 20 % sur un code d'emplacement et 49 % sur un numéro d'article. Choisissez en fonction de vos données réelles, pas d'un chiffre général.
Quelle que soit la symbologie retenue, ce qui compte au final est une impression nette qui se lit du premier coup. Vous pouvez générer des codes Code 128 ou Code 39 conformes, en SVG ou PDF haute résolution, avec notre générateur Code 128.