Questo è il problema con cui sto lavorando: dato un numero di telefono da qualsiasi parte del mondo e alcune informazioni sulla posizione (stato, provincia, eventualmente nome del paese se sono fortunato, ecc.), restituire il codice ISO del paese per quel numero.
Ai fini di questa domanda, non mi concentrerò sulle informazioni sulla posizione, in quanto ciò fornisce una soluzione alternativa per determinare il codice paese che non ha nemmeno bisogno di utilizzare il numero di telefono (tuttavia, sarebbe utile per scopi di convalida)
Quando ho iniziato a lavorare sul problema, speravo che esistesse un modo deterministico per capirlo perché c'era una sorta di standard internazionale là fuori. Divenne immediatamente evidente che uno non esiste per i numeri di telefono. Esistono standard all'interno dei paesi, tra paesi (ad esempio, NANP ), ma nessuno standard internazionale unificato.
Giocare con libphonenumbers per alcuni giorni, sembra essere in grado di fornire una convalida accurata di un numero di telefono se mi viene fornito un codice paese (ad esempio: CA per Canada, GB per il Regno Unito, ecc.)
La libreria fornisce due metodi: isPossibleNumber
e isValidNumberForRegion
. Questo è il codice che sto usando
boolean isValid;
PhoneNumber number;
PhoneNumberUtil util = PhoneNumberUtil.getInstance();
String numStr = "(123) 456-7890";
for (String r : util.getSupportedRegions())
{
try {
// check if it's a possible number
isValid = util.isPossibleNumber(numStr, r);
if (isValid)
{
number = util.parse(numStr, r);
// check if it's a valid number for the given region
isValid = util.isValidNumberForRegion(number, r);
if (isValid)
System.out.println(r + ": " + number.getCountryCode() + ", " + number.getNationalNumber());
}
} catch (NumberParseException e)
{
e.printStackTrace();
}
}
Quindi, ad esempio, se ho preso un numero di telefono arbitrario come +44 20 7930 4832
e l'ho eseguito attraverso il metodo, otterrei il seguente risultato
GB: 44, 2079304832
Ora, suppongo che mi venga dato il prefisso (a volte è lì). Se non mi fosse stato dato il prefisso, potrei ottenere qualcosa come 20 7930 4832
, ei risultati non sono così belli
DE: 49, 2079304832
US: 1, 2079304832
GB: 44, 2079304832
FI: 358, 2079304832
AX: 358, 2079304832
RS: 381, 2079304832
CN: 86, 2079304832
NZ: 64, 2079304832
IN: 91, 2079304832
IR: 98, 2079304832
JP: 81, 2079304832
Dato un numero di telefono, posso eseguirlo attraverso tutte le diverse regole per ogni paese e filtrare l'elenco da 244 a circa 20 o meno se sono fortunato, ma non sono sicuro se c'è qualcos'altro potrebbe fare per cercare di indovinare il paese.