it-swarm.com.de

Was ist der beste Weg, um Telefonnummern mit Java in das internationale Format (E.164) zu konvertieren?

Was ist der beste Weg, um Telefonnummern mit Java in das internationale Format (E.164) zu konvertieren?

Wenn ich eine Telefonnummer und eine Länder-ID (zum Beispiel einen ISO-Ländercode) habe, möchte ich diese in eine Telefonnummer im internationalen E.164-Standardformat konvertieren.

Ich bin mir sicher, dass ich es mit der Hand ganz leicht machen kann - aber ich wäre nicht sicher, ob es in allen Situationen richtig funktionieren würde.

Welches Java-Framework/-Bibliothek/-Dienstprogramm würden Sie empfehlen, um dies zu erreichen?

P.S. Die "Telefonnummer" könnte alles sein, was für die breite Öffentlichkeit erkennbar ist - wie z

* (510) 786-0404
* 1-800-GOT-MILK
* +44-(0)800-7310658

das letzte ist mein Favorit - so schreiben manche Leute ihre Nummer in Großbritannien und das bedeutet, dass Sie entweder die +44 oder die 0 verwenden sollten.

Die E.164-Formatnummer sollte ausschließlich numerisch sein und den vollständigen internationalen Ländercode (z. B. + 44) verwenden.

26
Vihung

Google bietet eine Bibliothek zum Arbeiten mit Telefonnummern. Das gleiche, das sie für Android verwenden

http://code.google.com/p/libphonennummer/

String swissNumberStr = "044 668 18 00"
PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
try {
  PhoneNumber swissNumberProto = phoneUtil.parse(swissNumberStr, "CH");
} catch (NumberParseException e) {
  System.err.println("NumberParseException was thrown: " + e.toString());
}

// Produces "+41 44 668 18 00"
System.out.println(phoneUtil.format(swissNumberProto, PhoneNumberFormat.INTERNATIONAL));
// Produces "044 668 18 00"
System.out.println(phoneUtil.format(swissNumberProto, PhoneNumberFormat.NATIONAL));
// Produces "+41446681800"
System.out.println(phoneUtil.format(swissNumberProto, PhoneNumberFormat.E164));
47
Collin Peters

Wenn man aus Erfahrung beim Schreiben dieser Art spricht, ist es mit 100% Zuverlässigkeit wirklich schwierig. Ich habe dazu Java-Code geschrieben, der die Daten, die wir haben, ziemlich gut verarbeiten kann, aber nicht in jedem Land anwendbar ist. Fragen, die Sie stellen müssen, sind:

Sind die Zuordnungen von Zeichen zu Nummern zwischen den Ländern konsistent? Die USA verwenden viel davon (z. B. 1800-GOT-MILK), aber in Australien ist dies ziemlich selten. Was Sie tun müssen, ist sicherzustellen, dass Sie die richtige Zuordnung für das betreffende Land vorgenommen haben, wenn es unterschiedlich ist (möglicherweise nicht). Ich weiß nicht, welche Länder unterschiedliche Alphabete verwenden (z. B. Kyrillisch in Russland und die ehemaligen Ostblockländer).

Sie müssen akzeptieren, dass Ihre Lösung nicht 100% ist und Sie sollten nicht damit rechnen. Sie müssen einen "besten" Ansatz wählen. Es gibt zum Beispiel keine wirkliche Möglichkeit zu wissen, dass 132345 eine gültige Telefonnummer ist, wie auch 1300 123 456, aber dies sind die einzigen beiden Muster für 13xx-Nummern, die nicht aus dem Ausland angerufen werden können.

Sie müssen auch fragen, ob Sie Regionen (Vorwahlen) validieren möchten. Ich glaube, dass die USA ein System verwenden, bei dem die zweite Ziffer der Vorwahl eine 1 oder eine 0 ist. Dies mag einmal der Fall gewesen sein, aber ich bin nicht sicher, ob es immer noch gilt. Wie auch immer, viele andere Länder haben andere Regeln. In Australien sind die gültigen Vorwahlen für Festnetztelefone und Mobiltelefone zweistellig (die erste ist 0). 08, 03 und 04 sind alle gültig. 01 ist nicht. Wie versorgst du das? Möchten Sie?

Länder verwenden unterschiedliche Konventionen, unabhängig davon, wie viele Ziffern sie schreiben. Sie müssen entscheiden, ob Sie etwas anderes als die "Norm" akzeptieren wollen. Dies sind alle in Australien üblich:

  • (02) 1234 5678
  • 02 1234 5678
  • 0411 123 123 (aber ich habe noch nie 04 1112 3456 gesehen)
  • 131 123
  • 13 1123
  • 131 123
  • 1 300 123 123
  • 1300 123 123
  • 02-1234-5678
  • 1300-234-234
  • +44 78 1234 1234
  • +44 (0) 78 1234 1234
  • + 44-78-1234-1234
  • + 44- (0) 78-1234-1234
  • 0011 44 ​​78 1234 1234 (0011 ist die internationale Vorwahlnummer)
  • (44) 078 1234 1234 (nicht üblich)

Und das ist einfach aus meinem Kopf. Für ein Land. In Frankreich ist es beispielsweise üblich, die Telefonnummer in Nummernpaaren (12 34 56 78) anzugeben und sie auch so auszusprechen: Anstelle von:

un (eins), deux (zwei), trois (drei), ...

es ist

douze (zwölf), trente-quatre (vierunddreißig), ... 

Möchten Sie diesem kulturellen Unterschied gerecht werden? Ich würde nicht annehmen, aber die Frage ist eine Überlegung wert, nur wenn Sie Ihre Regeln zu streng machen.

Außerdem können einige Personen Nebenstellen an Telefonnummern anhängen, möglicherweise mit "ext" oder einer ähnlichen Abkürzung. Möchten Sie dafür sorgen?

Sorry, kein Code hier. Nur eine Liste von Fragen, die Sie sich stellen sollten, und Fragen, die Sie berücksichtigen sollten. Wie andere bereits gesagt haben, kann eine Reihe regulärer Ausdrücke einen Großteil der oben genannten Aufgaben erfüllen. Letztlich sind jedoch die Telefonnummernfelder (meistens) Freiformtext am Ende des Tages.

10
cletus

Das war meine Lösung:

public static String FixPhoneNumber(Context ctx, String rawNumber)
{
    String      fixedNumber = "";

    // get current location iso code
    TelephonyManager    telMgr = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE);
    String              curLocale = telMgr.getNetworkCountryIso().toUpperCase();

    PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
    Phonenumber.PhoneNumber     phoneNumberProto;

    // gets the international dialling code for our current location
    String              curDCode = String.format("%d", phoneUtil.getCountryCodeForRegion(curLocale));
    String              ourDCode = "";

    if(rawNumber.indexOf("+") == 0)
    {
        int     bIndex = rawNumber.indexOf("(");
        int     hIndex = rawNumber.indexOf("-");
        int     eIndex = rawNumber.indexOf(" ");

        if(bIndex != -1)
        {
            ourDCode = rawNumber.substring(1, bIndex);
        }
        else if(hIndex != -1) 
        {               
            ourDCode = rawNumber.substring(1, hIndex);
        }
        else if(eIndex != -1)
        {
            ourDCode = rawNumber.substring(1, eIndex);
        }
        else
        {
            ourDCode = curDCode;
        }           
    }
    else
    {
        ourDCode = curDCode;
    }

    try 
    {
      phoneNumberProto = phoneUtil.parse(rawNumber, curLocale);
    } 

    catch (NumberParseException e) 
    {
      return rawNumber;
    }

    if(curDCode.compareTo(ourDCode) == 0)
        fixedNumber = phoneUtil.format(phoneNumberProto, PhoneNumberFormat.NATIONAL);
    else
        fixedNumber = phoneUtil.format(phoneNumberProto, PhoneNumberFormat.INTERNATIONAL);

    return fixedNumber.replace(" ", "");
}

Ich hoffe das hilft jemandem mit dem gleichen Problem.

Genießen und frei verwenden.

3
arksoft

Danke für die Antworten. Wie in der ursprünglichen Frage angegeben, bin ich viel mehr an der Formatierung der Nummer im Standardformat interessiert als an der Feststellung, ob es sich um eine gültige (wie bei einer echten) Telefonnummer handelt.

Ich habe derzeit einen handgefertigten Code, der eine Telefonnummer (wie vom Benutzer eingegeben) und einen Herkunftslandkontext sowie einen Ziellandekontext (das Land, aus dem die Nummer gewählt wird, und das Land, in das die Nummer gewählt wird) enthalten - Dies ist dem System bekannt) und führt dann die folgende Konvertierung in Schritten durch

  1. Entferne alle Leerzeichen von der Zahl

  2. Übersetzen Sie alle Buchstaben in Ziffern - verwenden Sie eine Nachschlagetabelle von Buchstabe zu Ziffer (z. B. A -> 2, B -> 2, C -> 2, D -> 3) usw. für das Tastenfeld (ich wusste es nicht dass einige Tastaturen diese unterschiedlich verteilen)

  3. Alle Interpunktionszeichen entfernen - ein vorangestelltes "+" beibehalten, falls vorhanden (falls die Nummer bereits in einem internationalen Format vorliegt).

  4. Bestimmen Sie, ob die Nummer ein internationales Wählpräfix für den Länderkontext hat - z. Wenn der Quellkontext UK ist, würde ich sehen, ob es mit einer '00' beginnt - und es durch ein '+' ersetzen. Ich überprüfe derzeit nicht, ob auf die Ziffern nach '00' die internationale Vorwahl des Ziellandes folgt. Ich schaue in einer Nachschlagetabelle nach dem internationalen Wählpräfix für das Ursprungsland (z. B. GB -> '00', US -> '011' usw.).

  5. Stellen Sie fest, ob die Nummer ein Ortswahlpräfix für den Länderkontext hat - z. Wenn der Quellkontext UK ist, würde ich nachsehen, ob er mit einer '0' beginnt - und ihn durch ein '+' gefolgt von der internationalen Vorwahl für das Zielland ersetzen. Ich schaue in einer Nachschlagetabelle nach dem Ortswahlpräfix für das Ursprungsland (z. B. GB -> '0', US -> '1' usw.) und die internationale Vorwahlnummer für das Zielland in einer anderen Nachschlagetabelle ( zB 'GB' = '44', US = '1')

Es scheint für alles zu funktionieren, was ich bis jetzt geworfen habe - bis auf die +44 (0) 1234-567-890-Situation - ich werde einen speziellen Fall-Check für diese hinzufügen.

Das Schreiben war nicht schwer - und ich kann für jede seltsame Ausnahme, die mir begegnet, Sonderfälle hinzufügen. Ich würde aber gerne wissen, ob es eine Standardlösung gibt.

Die Telefongesellschaften scheinen sich jeden Tag damit zu befassen. Beim Wählen von Nummern mit dem PSTN erhalte ich niemals inkonsistente Ergebnisse. In den USA (wo Mobiltelefone die gleichen Vorwahlen wie Festnetz haben, könnte ich beispielsweise + 1-123-456-7890 oder 011-1-123-456-7890 wählen (wobei 011 die internationale Vorwahl im Internet ist) USA und 1 ist die internationale Vorwahl für die USA), 1-123-456-7890 (wobei 1 die Ortsvorwahl in den USA ist) oder sogar 456-7890 (vorausgesetzt, ich befand mich damals in der Vorwahl 123). Ich gehe davon aus, dass diese Wählnummern intern in dasselbe E.164-Standardformat konvertiert werden und dass die Konvertierung alle in Software erfolgt.

1
Vihung

Um ehrlich zu sein, klingt es so, als hätten Sie die meisten Basen bereits abgedeckt.

Das +44 (0) 800-Format, das manchmal (falsch) in Großbritannien verwendet wird, ist ärgerlich und gemäß E.123 nicht streng gültig. Dies ist die ITU-T-Empfehlung für die Anzeige von Zahlen. Wenn Sie keine Kopie von E.123 haben, lohnt sich ein Blick.

Für das, was es wert ist, verwendet das Telefonnetz selbst nicht immer E.164. In der ISDN-Signalisierung, die von der PBX (oder im Netzwerk, wenn Sie ein Steam-Telefon verwenden) generiert wird, befindet sich häufig ein Flag, das dem Netzwerk mitteilt, ob es sich um eine lokale, nationale oder internationale Rufnummer handelt .

1
Alnitak

Mir ist keine Standardbibliothek oder ein Framework bekannt, über das Telefonnummern in E.164 formatiert werden können.

Die für unser Produkt verwendete Lösung, die die Formatierung PBX der angegebenen Anrufer-ID in E.164 erfordert, besteht darin, eine Datei (Datenbanktabelle) bereitzustellen, die die Informationen des E.164-Formats für alle anwendbaren Länder enthält. Dies hat den Vorteil, dass die Anwendung aktualisiert werden kann (um alle seltsamen Eckfälle in verschiedenen PSTN-Netzwerken zu behandeln), ohne dass Änderungen an der Produktionscodebasis erforderlich sind.

Die Tabelle enthält eine Zeile für jeden Ländercode und Informationen zur Vorwahllänge und Teilnehmerlänge. Je nachdem, welche Variationen mit Vorwahl- und Teilnehmernummernlängen möglich sind, kann es mehrere Einträge für ein Land geben.

Verwenden Sie den PSTN (partiellen) Wählplan für Neuseeland als Beispiel für die Tabelle.

CC  AREA_CODE  AREA_CODE_LENGTH  SUBSCRIBER  SUBSCRIBER_LENGTH
64                            1              7
64         21                 2              7
64        275                 3              6

Wir machen etwas Ähnliches wie das, was Sie beschrieben haben, d. H. Entfernen Sie die angegebene Telefonnummer von nicht-stelligen Zeichen und formatieren Sie sie dann basierend auf verschiedenen Regeln hinsichtlich der Gesamtlänge des Nummernplans, des externen Zugangscodes und der internationalen und internationalen Zugangscodes.

0
Henk

Dies ist eine sehr schwierige Aufgabe, da die Telefonnummern in jedem Land unterschiedlich geschrieben werden.

Wir pflegten eine Liste von REGEXPs (wir unterstützten 19 Formate), um 3 Teile einer Zahl zu parsen, und wandelten diese 3 Teile in "+ {1} {2} {3}" um.

Sortieren Sie Regexx zuerst nach spezifischer und nehmen Sie dann die erste, die erfolgreich analysiert werden kann.

In einigen Ländern können Sie die 112 als gültige Telefonnummer bestätigen. Wenn Sie jedoch eine Landesvorwahl eingeben, ist diese nicht mehr gültig. In anderen Ländern können Sie 112 nicht bestätigen, aber Sie können 911 als gültige Telefonnummer bestätigen.

Ich habe einige Telefone gesehen, die Q auf der 7-Taste und Z auf der 9-Taste setzen. Ich habe einige Telefone gesehen, die Q und Z auf die 0-Taste setzen, und andere, die Q und Z auf die 1-Taste setzen.

Eine Vorwahlnummer, die gestern existiert hat, existiert heute möglicherweise nicht und umgekehrt.

In der Hälfte Nordamerikas (Ländercode 1) war die zweite Ziffer für Vorwahlen 0 oder 1, aber diese Regel wurde vor 10 Jahren aufgehoben.

0