I formati dei codici postali non sono intercambiabili, e un validatore che presuppone cinque cifre rifiuterà la maggior parte del mondo. Le differenze sono strutturali, non estetiche: alcuni sistemi sono numerici con zeri iniziali, altri mescolano lettere e cifre, alcuni collocano il codice prima della città, e due paesi nel set di fixture di questo sito non hanno alcun codice postale.
Questo riferimento raccoglie i pattern che contano per uno sviluppatore che costruisce un modulo di indirizzo, con regex testabili direttamente. Traccia anche il confine che il sito stesso traccia: la validazione postale qui è un controllo di struttura per ogni paese, più un controllo di esistenza per gli ZIP statunitensi su un dataset di 40.979 righe. Nulla in questa guida implica che un codice corrispondente sia assegnato o consegnabile.
Perché i codici postali non sono un campo numerico
Gli Stati Uniti usano cinque cifre o ZIP+4, il che tenta gli sviluppatori a modellare i codici postali come interi. Quel modello si rompe immediatamente in Canada, Regno Unito, Paesi Bassi, Irlanda, Malta e Argentina, dove le lettere fanno parte del codice. Si rompe anche silenziosamente in Germania, Francia, Spagna, Italia e Polonia, dove gli zeri iniziali sono significativi e una colonna intera li elimina.
Una seconda classe di bug deriva dalla posizione. La maggior parte dei paesi occidentali mette il codice postale dopo la città, ma Germania, Francia, Paesi Bassi e Giappone lo collocano prima della città, e il Giappone mette l'intero codice all'inizio assoluto dell'indirizzo. Se il tuo modulo genera un template fisso, produrrà indirizzi che un lettore locale trova palesemente sbagliati anche se ogni campo è compilato.
- Memorizza sempre i codici postali come testo, mai come interi
- Mantieni intatti gli zeri iniziali attraverso ogni livello, inclusa l'esportazione CSV
- Consenti le lettere a meno che il paese non sia strettamente numerico
- Non dare per scontato che il codice postale segua la città
- Tratta il separatore come presentazione, non come struttura
Sistemi numerici e loro intervalli
La maggior parte dell'Europa usa codici numerici a lunghezza fissa. Germania, Francia, Spagna, Italia, Grecia, Turchia e Arabia Saudita usano cinque cifre; Austria, Belgio, Svizzera, Danimarca, Norvegia, Ungheria e Sudafrica ne usano quattro; Polonia e Portogallo aggiungono un trattino; la Svezia usa tre cifre, uno spazio e due. La Cechia usa cinque cifre tipicamente scritte con uno spazio dopo la terza.
Asia e America Latina sono per lo più numeriche ma con lunghezze diverse. India, Cina, Russia, Singapore e Nigeria usano sei cifre; il Giappone ne usa sette con un trattino convenzionale dopo la terza; la Corea del Sud ne usa cinque; il Brasile ne usa otto con un trattino dopo la quinta; il Cile ne usa sette; la Colombia ne usa sei; Perù e Messico ne usano cinque. La sola lunghezza non basta a identificare un paese, ed è per questo che un validatore ha bisogno del campo paese prima di validare qualsiasi cosa.
| Paese | Lunghezza | Forma canonica | Regex |
|---|---|---|---|
| Germania | 5 cifre | 10115 | ^\d{5}$ |
| Francia | 5 cifre | 75008 | ^\d{5}$ |
| Spagna | 5 cifre | 28013 | ^\d{5}$ |
| Austria | 4 cifre | 1010 | ^\d{4}$ |
| Polonia | 5 cifre con trattino | 00-001 | ^\d{2}-\d{3}$ |
| Portogallo | 7 cifre con trattino | 1250-096 | ^\d{4}-\d{3}$ |
| Svezia | 5 cifre con spazio | 114 55 | ^\d{3}\s\d{2}$ |
| Giappone | 7 cifre con trattino | 100-0001 | ^\d{3}-\d{4}$ |
| Brasile | 8 cifre con trattino | 01310-100 | ^\d{5}-\d{3}$ |
| India | 6 cifre | 110001 | ^\d{6}$ |
| Corea del Sud | 5 cifre | 04524 | ^\d{5}$ |
| Messico | 5 cifre | 06600 | ^\d{5}$ |
Sistemi alfanumerici e regole sui caratteri
Il Canada usa il pattern A1A 1A1, e le lettere sono limitate. Il primo carattere non può essere D, F, I, O, Q, U, W o Z, e le lettere rimanenti non possono essere D, F, I, O, Q o U. Lo spazio tra i due gruppi è convenzionale. Un validatore che consente qualsiasi lettera accetterà codici che Canada Post non emette mai.
Il Regno Unito usa un codice esterno di due-quattro caratteri seguito da un singolo spazio e un codice interno di tre caratteri, come in SW1A 1AA. I Paesi Bassi sono quattro cifre, uno spazio e due lettere maiuscole. L'Irlanda usa un Eircode di sette caratteri diviso in una routing key di tre caratteri e un identificatore univoco di quattro caratteri. Malta è tre lettere, uno spazio e quattro cifre. L'Argentina usa il CPA di otto caratteri, una lettera seguita da quattro cifre e tre lettere, per esempio C1425ABC.
| Paese | Pattern | Esempio | Regex |
|---|---|---|---|
| Canada | A1A 1A1 con lettere limitate | K1A 0B1 | ^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ] ?\d[ABCEGHJKLMNPRSTVWXYZ]\d$ |
| Regno Unito | 2-4 caratteri esterni, 3 interni | SW1A 1AA | ^[A-Z]{1,2}\d[A-Z\d]? ?\d[A-Z]{2}$ |
| Paesi Bassi | 4 cifre, 2 lettere | 1012 AB | ^\d{4} ?[A-Z]{2}$ |
| Irlanda | routing key di 3 caratteri, identificatore di 4 | D02 X285 | ^(?:[A-Z]\d{2}|D6W) ?[A-Z0-9]{4}$ |
| Malta | 3 lettere, 4 cifre | VLT 1117 | ^[A-Z]{3} ?\d{4}$ |
| Argentina | Lettera, 4 cifre, 3 lettere | C1425ABC | ^[A-Z]\d{4}[A-Z]{3}$ |
Paesi senza codice postale
Hong Kong e gli Emirati Arabi Uniti non hanno un sistema di codici postali. Entrambi sono nel set di fixture di 38 paesi di questo sito, e il generatore restituisce un valore postale vuoto per loro invece di inventare cifre. Questo è il comportamento corretto ed è anche un caso di test utile, perché un modulo che contrassegna il codice postale come obbligatorio è rotto per entrambi i mercati.
La convenzione negli Emirati è un numero di casella postale, che non è un codice postale e non dovrebbe essere forzato in quel campo. Gli indirizzi di Hong Kong usano il distretto e la via, e la posta viene consegnata senza alcun codice. Se il tuo modello dati richiede un valore postale non nullo, usa un sentinella esplicito come un flag a livello di paese, non un codice falso, perché un codice falso supererà la validazione e poi fallirà ogni controllo a valle che presuppone un codice reale.
- Hong Kong: nessun codice postale, distretto più via è l'indirizzo
- Emirati Arabi Uniti: nessun codice postale, la casella postale è la convenzione comune
- Rendi il campo postale opzionale quando è selezionato uno dei due paesi
- Non sostituire mai 00000 o N/A in una colonna postale
- Registra l'assenza esplicitamente così le esportazioni non sembrano dati mancanti
Controlli di struttura versus controlli di esistenza
Un controllo di struttura risponde se una stringa corrisponde al pattern del paese. Un controllo di esistenza risponde se il codice appare in un dataset di riferimento. Solo il secondo può dirti che un codice non è mai stato assegnato. Questo sito esegue il controllo di struttura per tutti i 38 paesi e un controllo di esistenza per gli ZIP statunitensi su 40.979 righe, e li etichetta diversamente così nessuno li confonde.
Nessuno dei due controlli prova la consegnabilità. Uno ZIP statunitense di cinque cifre può esistere mentre l'indirizzo stradale sotto di esso no, e un codice tedesco strutturalmente valido può appartenere a una città diversa da quella fornita. Se hai bisogno di quel livello di garanzia, ti serve un dataset di riferimento postale e un database a livello di strada, che è un prodotto diverso da un controllo di formato.
| Tipo di controllo | Copre | Prova | Non prova |
|---|---|---|---|
| Corrispondenza pattern | Tutti i 38 paesi | Ben formato per quel paese | Che il codice sia assegnato |
| Esistenza ZIP USA | 40.979 righe ZIP USA | Il codice è nel dataset | Accordo di città o via |
| Regola campo obbligatorio | Livello modulo | L'invio può procedere | Qualsiasi validità nel mondo reale |
| Lunghezza e charset | Livello campo | L'archiviazione non andrà in overflow | Correttezza del paese |
Dettagli regex che causano bug in produzione
Ancora ogni pattern. Un /\d{5}/ non ancorato corrisponde alle cinque cifre dentro una stringa di nove cifre e riporta successo. Usa ^ e $, o l'API equivalente di corrispondenza completa. In JavaScript, \d corrisponde solo alle cifre ASCII; in Python, \d corrisponde per impostazione predefinita alle cifre Unicode, quindi un pattern può accettare numeri arabi orientali a meno che tu non compili con re.ASCII o scriva [0-9].
Decidi esplicitamente se il separatore è obbligatorio. Per la visualizzazione, inserisci tu stesso il separatore canonico. Per l'input, accetta zero o uno spazio o trattino e normalizza. Fai attenzione ai trattini all'interno delle classi di caratteri, dove definiscono intervalli a meno che non siano escapati o posizionati per ultimi. E non usare un flag case-insensitive per coprire un bug di normalizzazione: converti in maiuscolo al momento della scrittura e mantieni la forma di visualizzazione canonica.
- Ancora con ^ e $, o usa una funzione di corrispondenza completa
- Usa [0-9] quando intendi cifre ASCII
- Accetta separatori opzionali in input, emetti separatori canonici in visualizzazione
- Escapa i trattini o posizionali per ultimi dentro una classe di caratteri
- Converti in maiuscolo prima della corrispondenza invece di spargere flag di case
- Rifiuta esplicitamente spazi non separabili e caratteri a larghezza zero
Normalizza in scrittura, formatta in visualizzazione
Memorizza una forma canonica e deriva la forma di visualizzazione. La forma canonica è di solito maiuscola con il separatore standard, o solo cifre quando il separatore è puramente convenzionale. Conserva l'input grezzo dell'utente in una colonna separata se hai bisogno di una traccia di controllo, perché la normalizzazione è lossy e un agente di supporto potrebbe aver bisogno di vedere esattamente cosa è stato digitato.
La normalizzazione specifica per paese è piccola ma reale. Il Canada vuole lettera-cifra-lettera maiuscola, spazio, cifra-lettera-cifra. I Paesi Bassi vogliono lettere maiuscole dopo le cifre. Il Regno Unito vuole un singolo spazio e maiuscole. Brasile e Giappone usano un trattino che gli utenti spesso omettono, quindi normalizza alla forma con trattino. La Germania non vuole alcun separatore e deve mantenere lo zero iniziale.
| Paese | Input grezzo | Canonico memorizzato | Visualizzazione |
|---|---|---|---|
| Canada | k1a0b1 | K1A 0B1 | K1A 0B1 |
| Paesi Bassi | 1012ab | 1012 AB | 1012 AB |
| Regno Unito | sw1a1aa | SW1A 1AA | SW1A 1AA |
| Brasile | 01310100 | 01310-100 | 01310-100 |
| Giappone | 1000001 | 100-0001 | 100-0001 |
| Germania | 10115 | 10115 | 10115 |
| Svezia | 11455 | 114 55 | 114 55 |
Un corpus di test che puoi copiare
Ogni validatore ha bisogno di un corpus con almeno un caso valido e uno non valido per paese, più casi che testano specificamente la normalizzazione e l'archiviazione. La tabella seguente è un set iniziale. Nota che diversi casi non validi sono non validi per ragioni specifiche del paese anziché generiche, ed è qui che la maggior parte dei test scritti a mano si ferma troppo presto.
Aggiungi casi per i paesi senza codice postale, per gli zeri iniziali e per le varianti di separatore che gli utenti digitano davvero. Se il validatore è condiviso tra client e server, esegui lo stesso corpus contro entrambe le implementazioni; una divergenza tra un client permissivo e un server rigoroso è la fonte più comune di segnalazioni del tipo "il modulo l'ha accettato ma l'API l'ha rifiutato".
| Caso | Valore | Paese | Atteso |
|---|---|---|---|
| ZIP+4 valido | 97205-2515 | Stati Uniti | Accetta |
| ZIP+4 non valido | 97205-251 | Stati Uniti | Rifiuta |
| Canadese valido | K1A 0B1 | Canada | Accetta |
| Lettera canadese errata | D1A 0B1 | Canada | Rifiuta |
| UK valido | SW1A 1AA | Regno Unito | Accetta |
| UK interno mancante | SW1A | Regno Unito | Rifiuta |
| Zero iniziale tedesco | 01067 | Germania | Accetta e preserva |
| Lettere in un sistema numerico | 1011A | Germania | Rifiuta |
| Nessun codice | Hong Kong | Accetta come vuoto | |
| Codice inventato | 99999 | Emirati Arabi Uniti | Rifiuta il campo |
Domande
- Hong Kong e gli Emirati Arabi Uniti non ne hanno, ed entrambi sono nel set di fixture di 38 paesi di questo sito. Il generatore restituisce un campo postale vuoto per loro invece di inventare un valore.
- No. Una corrispondenza strutturale significa solo che il valore è ben formato. Solo gli ZIP statunitensi ricevono qui un controllo di esistenza, su 40.979 righe, e nessun paese riceve una dichiarazione di consegnabilità.
- Mai. Canada, Regno Unito, Paesi Bassi, Irlanda, Malta e Argentina usano lettere, e Germania, Francia, Spagna, Italia e Polonia hanno zeri iniziali significativi.
- Il codice olandese è quattro cifre seguite da due lettere maiuscole, per esempio 1012 AB. Le lettere fanno parte del codice, non sono un suffisso di regione, e una regex di sole cifre rifiuta indirizzi validi.
- Accetta input con zero o uno spazio, converti in maiuscolo e memorizza un singolo separatore canonico. Emetti la forma canonica per la visualizzazione invece di ripetere ciò che l'utente ha digitato.
Quali paesi non hanno codici postali?+
Un codice postale valido significa che l'indirizzo è reale?+
I codici postali dovrebbero essere memorizzati come interi?+
Perché i Paesi Bassi mettono le lettere dopo le cifre?+
Come dovrei gestire lo spazio in un codice britannico o canadese?+
Gli esempi sono sintetici. Non usare un indirizzo generato per verifiche di identità, registrazione di account o consegne.