Les codes postaux du monde : pourquoi un générateur d'adresses universel ne peut pas exister
Presque toutes les bibliothèques de données de test contiennent une fonction qui ressemble à ceci :
function postcode() { return str_pad(rand(0, 99999), 5, '0', STR_PAD_LEFT); }
Elle est fausse dans 42 des 64 locales que nous livrons.
Pas « légèrement non idiomatique » — structurellement fausse, au sens où la chaîne qu'elle renvoie ne pourrait en aucun cas être un code postal dans le pays concerné. Et la raison n'est pas que cinq serait un chiffre malchanceux. C'est que « code postal » n'est pas une seule chose. C'est une étiquette que nous avons tendue sur plusieurs dizaines de systèmes nationaux sans lien entre eux, qui encodent des objets différents à des résolutions différentes, plus quelques pays qui n'ont aucun système de ce genre.
Nous avons mesuré cela sur nos propres données livrées, plutôt que de l'affirmer dans l'abstrait.
À quoi ressemblent réellement 64 locales
Chaque fichier de localités que nous livrons est un triplet Ville ⇥ Région ⇥ Code postal construit à partir de sources réelles. En réduisant chaque code postal à une forme — chiffre → 9, lettre → A —, on obtient la distribution ci-dessous.
| Forme | Locales | Exemples |
|---|---|---|
99999 (5 chiffres) | 22 | en_US 10001 · de_DE 10115 · fr_FR 75001 · tr_TR 34000 |
9999 (4 chiffres) | 20 | da_DK 1050 · en_AU 2000 · hu_HU 1051 · ka_GE 0105 |
999999 (6 chiffres) | 6 | en_IN 400001 · ru_RU 101000 · zh_CN 100000 · vi_VN 700000 |
999 (3 chiffres) | 2 | is_IS 101 · zh_TW 100 |
9999999 (7 chiffres) | 1 | he_IL 6100000 |
9999999999 (10) | 1 | fa_IR 1116843734 |
| Contient des lettres ou des séparateurs | 12 | voir ci-dessous |
Données arrêtées au 2026-07-18, mesurées sur les fichiers de localités livrés.
La forme à cinq chiffres est la plus fréquente prise isolément, et elle reste malgré tout une minorité — 22 sur 64, environ 34 %. Un générateur qui émet cinq chiffres partout tombe juste pour environ un tiers du monde et se trahit sur les deux autres tiers. Et l'écart n'est pas une différence d'arrondi : l'Islande utilise trois chiffres, l'Iran en utilise dix. Cela fait un rapport de 3,3× sur la seule longueur.
Les douze qui ne sont pas que des chiffres
| Locale | Forme | Exemple | Ce qu'est la structure supplémentaire |
|---|---|---|---|
en_CA / fr_CA | A9A 9A9 | M5H 2N2 | lettres et chiffres en alternance |
nl_NL | 9999 AA | 1011 AB | des chiffres, puis un suffixe de deux lettres |
lv_LV | AA-9999 | LV-1050 | préfixe de pays, puis quatre chiffres |
ro_MD | AA-9999 | MD-2001 | préfixe de pays, puis quatre chiffres |
cs_CZ | 999 99 | 110 00 | cinq chiffres coupés 3+2 par une espace |
pl_PL | 99-999 | 00-001 | cinq chiffres coupés 2+3 par un trait d'union |
ja_JP | 999-9999 | 100-0001 | sept chiffres coupés 3+4 |
pt_PT | 9999-999 | 1000-001 | sept chiffres coupés 4+3 |
pt_BR | 99999-999 | 01000-000 | huit chiffres coupés 5+3 |
en_GB | AA9 9AA · A9 9AA · AA99 9AA · AA9A 9AA | EC1A 1BB | quatre formes à l'intérieur d'un même pays |
en_IE | 16 formes distinctes | D01 VFEK | voir la section sur l'Irlande |
Regardez la Tchéquie et la Pologne ensemble. Toutes deux ont un système à cinq chiffres. Toutes deux coupent ces cinq chiffres. La Tchéquie les coupe 3+2 par une espace, la Pologne les coupe 2+3 par un trait d'union. Aucun principe à votre disposition ne permet de prédire lequel ; il faut le savoir. Il en va de même pour le Portugal (9999-999) face au Japon (999-9999) — sept chiffres de part et d'autre, coupés à des endroits opposés.
Et remarquez ce que fait le séparateur en Lettonie et en Moldavie. LV- et MD- ne font pas partie du contenu informationnel du code ; c'est un préfixe de pays ISO que ces deux pays écrivent dans le code lui-même. Retirez-le, et le code fonctionne toujours. Retirez l'espace d'un 1011 AB néerlandais, et vous avez là encore un code valide — mais retirez le trait d'union d'un 100-0001 japonais, et vous obtenez une chaîne de sept chiffres que Japan Post n'analysera pas. Les séparateurs sont tantôt cosmétiques, tantôt porteurs d'information, et savoir lequel des deux s'applique dépend du pays.
Le cas de l'Ouganda : 60 codes qui valent tous 00000
Une ligne de ce premier tableau est un mensonge, et il vaut mieux la montrer que la cacher.
en_UG figure dans la colonne des 5 chiffres. Ses 60 entrées sur 60 valent 00000. L'Ouganda n'a pas de système national de codes postaux. Il n'y a rien à mettre dans le champ, donc le champ porte une valeur de remplissage, et une analyse naïve des formes — y compris notre propre premier passage — range l'Ouganda sous « cinq chiffres », aux côtés de l'Allemagne et des États-Unis.
C'est l'argument le plus fort possible en faveur de la thèse de cet article. Le schéma possède une colonne postcode, donc chaque pays en reçoit une, donc chaque pays semble avoir des codes postaux. Le modèle de données a fabriqué l'universalité qu'il était censé décrire. Le décompte honnête des locales véritablement à cinq chiffres dans nos données est de 21, pas de 22.
Il y a plus de pays dans cette situation que les développeurs ne l'imaginent — l'Irlande elle-même en faisait partie jusqu'à très récemment, ce qui nous amène au système le plus instructif de tout l'ensemble.
Irlande : le code qui identifie un bâtiment
L'Irlande n'a eu aucun système national de codes postaux jusqu'en juillet 2015. Dublin avait des districts postaux numérotés (de D1 à D24), et partout ailleurs une adresse se composait d'un nom de maison, d'un townland et d'un comté — littéralement, sans aucun code. Le pays a fait fonctionner sa poste ainsi pendant tout le vingtième siècle.
Quand l'Irlande a fini par construire un système, elle n'a pas construit celui que tous les autres ont. Un Eircode compte sept caractères en deux parties qui remplissent des tâches fondamentalement différentes :
A65 F4E2
└┬┘ └─┬─┘
│ └── identifiant unique d'UNE propriété — pas de géographie, pas d'ordre
└─────── clé de routage — une zone géographique
Les trois premiers caractères sont géographiques. Les quatre derniers ne le sont pas. Ils identifient un bâtiment individuel, ils sont délibérément non séquentiels et ils ne portent absolument aucune information de localisation. Deux maisons voisines dans la même rue ont des Eircodes sans rapport entre eux. « L'Eircode de Galway » n'existe pas.
Toutes les hypothèses sur lesquelles un générateur de codes postaux s'appuie d'ordinaire tombent ici d'un seul coup. Le code n'est pas hiérarchique dans sa seconde moitié. Il ne peut pas être interpolé. Des codes voisins ne sont pas des lieux voisins. Vous ne pouvez pas le déduire d'une ville, parce qu'une ville en compte des dizaines de milliers.
L'alphabet n'est pas l'alphabet
Les Eircodes utilisent 25 caractères : les dix chiffres et seulement 15 des 26 lettres. En sont exclues, délibérément :
B G I J L M O Q S U Z
Lisez cette liste à côté des chiffres et l'intention de conception devient évidente. B/8, G/6, I/1, J/1, L/1, O/0, Q/0, S/5, Z/2 — chacune d'elles est un caractère qui se lit à tort comme un chiffre, ou comme une autre lettre, lorsqu'il est manuscrit ou scanné. Le système irlandais a supprimé l'ambiguïté au stade de la conception plutôt que de la traiter au stade de l'analyse.
L'ensemble autorisé est exactement ACDEFHKNPRTVWXY0123456789. Un générateur qui produit une chaîne alphanumérique aléatoire émettra un caractère interdit dans environ un tiers des cas, et le résultat n'est pas un Eircode rare ou inhabituel — c'est une chaîne qu'aucun validateur en Irlande n'acceptera.
Comment nous les générons
Nous livrons 72 lignes irlandaises portant 71 clés de routage distinctes, avec des Eircodes réels complets. Si nous utilisions le code stocké tel quel, chaque carte générée pour Dublin porterait le même Eircode D01 VFEK — une falsification immédiate et visible dans un pays où des voisins ont des codes différents.
Le moteur d'exécution découpe donc le code comme le standard le découpe :
if ($locale === 'en_IE' && $postcode !== '') {
$rk = strtok($postcode, ' '); // routing key: real, from locality data
if ($rk !== false && $rk !== '') {
$EIR = 'ACDEFHKNPRTVWXY0123456789'; // 25 characters, Eircode alphabet
$uid = '';
for ($i = 0; $i < 4; $i++) $uid .= $EIR[mt_rand(0, 24)];
$postcode = $rk . ' ' . $uid;
}
}
La clé de routage reste authentique et reste cohérente avec la ville. L'identifiant de quatre caractères — la partie qui est dépourvue de sens par conception — est tiré caractère par caractère dans l'alphabet correct. Le résultat est géographiquement véridique et individuellement distinct, ce qui reproduit exactement la forme du système réel.
Les 16 motifs distincts que montre notre fichier irlandais en sont la conséquence : l'identifiant mélange librement lettres et chiffres, si bien que A99 AAAA, A99 AA9A et A99 AAA9 ne sont que le même format observé lors de tirages différents.
L'exception que nos données ne contiennent pas
Les clés de routage irlandaises suivent le schéma lettre-chiffre-chiffre — D01, K67, T12, P31. Il en existe exactement une qui déroge : D6W, qui couvre Dublin 6 West et porte une lettre en troisième position parce que Dublin 6W existait comme district postal avant l'Eircode et devait être conservé.
Nous avons contrôlé, et D6W ne figure pas dans notre fichier. Les 71 clés de routage que nous livrons correspondent toutes à ^[A-Z]\d\d$. Ce n'est pas un défaut du générateur — la clé de routage vient des données de localités et est émise sans modification, donc rien de malformé n'est produit. C'est un trou dans la couverture : nos données irlandaises ne peuvent pas générer une adresse à Dublin 6W, et tout validateur que nous écririons d'après le motif observé lettre-chiffre-chiffre rejetterait un Eircode réel.
Nous le disons parce que c'est le genre de détail que l'on arrondit discrètement. L'expression régulière qui correspond à 100 % de vos données n'est pas l'expression régulière qui correspond au standard.
Ce que chaque système encode réellement
La longueur est la différence superficielle. La plus profonde, c'est que ces systèmes ne mesurent pas le même objet.
| Pays | Code | L'unité qu'il identifie |
|---|---|---|
| Irlande | A65 F4E2 | un bâtiment |
| Pays-Bas | 1011 AB | un côté de rue ; avec le numéro de maison, une adresse |
| Royaume-Uni | EC1A 1BB | un petit groupe d'adresses dans une même rue |
| Japon | 100-0001 | un chōme — un quartier à l'échelle d'un pâté de maisons |
| États-Unis | 10001 | une tournée de distribution / une zone desservie par un bureau de poste |
| Islande | 101 | un quartier d'une ville |
| Ouganda | — | rien ; le système n'existe pas |
Ce sont cinq résolutions différentes du même champ nominal. Le ZIP américain identifie une tournée de distribution — c'est un artefact opérationnel du Postal Service, et c'est pourquoi les limites des ZIP traversent les frontières de villes et même d'États, et pourquoi l'extension +4 existe pour descendre plus finement. Le code japonais descend jusqu'au chōme, une subdivision de pâté de maisons qui porte un nom. Le code néerlandais accompagné d'un numéro de maison constitue une adresse complète, sans qu'un nom de rue soit nécessaire.
Et la conséquence pour les données générées est directe. Attribuer un seul code postal par ville est un défaut dont la visibilité dépend entièrement du pays où l'on se trouve. Aux États-Unis, c'est une simplification bénigne — un vrai ZIP pour une vraie ville, simplement pas le seul. En Irlande, cela produit une impossibilité physique : des milliers de personnes habitant dans un seul bâtiment.
Ce qu'il faut contrôler dans tout générateur d'adresses
- Comptez les formes distinctes dans vos propres données avant d'écrire un validateur. Les nôtres comportent sept longueurs purement numériques et douze locales avec des lettres ou des séparateurs. Une seule expression régulière ne couvrira pas cela.
- Cherchez les colonnes de remplissage. Les 60 entrées
00000identiques de l'Ouganda ont passé tous les contrôles structurels dont nous disposions. Une colonne qui n'a qu'une seule valeur distincte sur toute une locale est un signal, pas une donnée. - Contrôlez l'alphabet, pas seulement la longueur. L'Irlande interdit onze lettres. Une chaîne alphanumérique aléatoire échoue dans environ un tiers des cas.
- Demandez-vous ce que le code identifie. S'il descend en dessous de la localité — un bâtiment, un côté de rue, un pâté de maisons —, alors un code par ville est une erreur structurelle, pas une approximation.
- N'inférez pas le standard à partir de votre échantillon. Nos 71 clés de routage irlandaises sont toutes lettre-chiffre-chiffre. Le standard autorise
D6W. Notre échantillon était unanime et pourtant incomplet. - Traitez les séparateurs comme des données tant que leur caractère cosmétique n'est pas prouvé. La Tchéquie coupe cinq chiffres en 3+2, la Pologne coupe cinq chiffres en 2+3, et rien dans les nombres ne vous dit lequel.
Le point général est celui qui revient sans cesse dans ce travail. Un champ nommé postcode dans un schéma de base de données ressemble à un concept unique parce que le schéma est une colonne unique. Les pays ne se sont jamais mis d'accord là-dessus. L'universalité est dans votre modèle de données, pas dans le monde — et tout générateur qui prend la colonne pour le concept finit par produire des adresses individuellement plausibles et collectivement impossibles.
Données arrêtées au 2026-07-18
Les formes de format ont été calculées le 18 juillet 2026 directement à partir des 64 fichiers de localités livrés, en associant chaque chiffre Unicode à 9 et chaque lettre Unicode à A, puis en comptant les résultats distincts par locale. Les nombres du tableau des formes sont des locales, pas des lignes.
Sources et notes :
- Fichiers de localités — 64 locales, chaque ligne un triplet
Ville ⇥ Région ⇥ Code postal. Locales purement numériques : 52. Locales contenant des lettres ou des séparateurs : 12. - Irlande — Eircode. 72 lignes, 71 clés de routage distinctes, toutes conformes à
^[A-Z]\d\d$;D6West absent de nos données. Format : clé de routage de 3 caractères + identifiant unique de propriété de 4 caractères. Alphabet autoriséACDEFHKNPRTVWXY0123456789(25 caractères ;B G I J L M O Q S U Zexclus). L'Eircode a été lancé en juillet 2015 ; auparavant, seuls les districts postaux de Dublin existaient. Notre fichier de localités ne stocke que la clé de routage ; l'identifiant de propriété de 4 caractères est généré à l'exécution. Les clés de routage proviennent de la classification officielle des Eircode Routing Keys du CSO (table PxStatNDQ07, dimensionC03349V04063), publiée sous licence CC BY 4.0 ; les bases d'adresses et de recherche faisant autorité, ECAD et ECAF, sont des produits commerciaux dont les licences s'acquièrent séparément. <eircode.ie/> - Ouganda —
en_UG. Les 60 lignes de localités portent toutes00000. L'Ouganda n'exploite aucun système national de codes postaux ; la colonne est une valeur de remplissage. Les poids de population des villes sont eux aussi absents pour cette locale (UBOS 2014 analysé mais non chargé). - Royaume-Uni —
en_GB. 52 lignes réparties sur quatre formes :AA9 9AA(41),A9 9AA(5),AA99 9AA(5),AA9A 9AA(1). - Code de génération — la branche irlandaise se trouve dans
ng_generate.phpet ajoute exactement quatre tirages au flux initialisé par la graine, uniquement pouren_IE; les autres locales traversent la branche sans être touchées et leurs cartes ne sont pas décalées. - Lecture complémentaire — le problème connexe de quelle ville est choisie, et pourquoi une sélection uniforme sous-estime les capitales d'un facteur d'environ trois, est traité dans Pourquoi les générateurs d'adresses produisent des villes implausibles.