Browse Source

JAVA: libphonenumber v4.9. Patch prepared by davinci.

pull/567/head
Lara Scheidegger 14 years ago
committed by Mihaela Rosca
parent
commit
564a829c2e
33 changed files with 580 additions and 266 deletions
  1. BIN
      java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/221_en
  2. BIN
      java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/224_en
  3. BIN
      java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/226_en
  4. BIN
      java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/242_en
  5. BIN
      java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/244_en
  6. BIN
      java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/244_pt
  7. BIN
      java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/245_en
  8. BIN
      java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/245_pt
  9. BIN
      java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/config
  10. +6
    -2
      java/libphonenumber/src/com/google/i18n/phonenumbers/CountryCodeToRegionCodeMap.java
  11. +57
    -27
      java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java
  12. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_882
  13. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF
  14. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CZ
  15. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ES
  16. BIN
      java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW
  17. +6
    -2
      java/libphonenumber/test/com/google/i18n/phonenumbers/CountryCodeToRegionCodeMapForTesting.java
  18. +2
    -3
      java/libphonenumber/test/com/google/i18n/phonenumbers/ExampleNumbersTest.java
  19. +71
    -17
      java/libphonenumber/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java
  20. BIN
      java/libphonenumber/test/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_979
  21. +20
    -1
      java/release_notes.txt
  22. +199
    -44
      resources/PhoneNumberMetaData.xml
  23. +25
    -0
      resources/PhoneNumberMetaDataForTesting.xml
  24. +2
    -2
      resources/geocoding/en/221.txt
  25. +21
    -21
      resources/geocoding/en/224.txt
  26. +33
    -27
      resources/geocoding/en/226.txt
  27. +7
    -7
      resources/geocoding/en/242.txt
  28. +38
    -34
      resources/geocoding/en/244.txt
  29. +20
    -19
      resources/geocoding/en/245.txt
  30. +42
    -35
      resources/geocoding/pt/244.txt
  31. +21
    -20
      resources/geocoding/pt/245.txt
  32. +5
    -1
      resources/phonemetadata.proto
  33. +5
    -4
      tools/java/java-build/src/com/google/i18n/phonenumbers/BuildMetadataJsonFromXml.java

BIN
java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/221_en View File


BIN
java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/224_en View File


BIN
java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/226_en View File


BIN
java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/242_en View File


BIN
java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/244_en View File


BIN
java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/244_pt View File


BIN
java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/245_en View File


BIN
java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/245_pt View File


BIN
java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/config View File


+ 6
- 2
java/libphonenumber/src/com/google/i18n/phonenumbers/CountryCodeToRegionCodeMap.java View File

@ -31,10 +31,10 @@ public class CountryCodeToRegionCodeMap {
// countries sharing a calling code, such as the NANPA countries, the one // countries sharing a calling code, such as the NANPA countries, the one
// indicated with "isMainCountryForCode" in the metadata should be first. // indicated with "isMainCountryForCode" in the metadata should be first.
static Map<Integer, List<String>> getCountryCodeToRegionCodeMap() { static Map<Integer, List<String>> getCountryCodeToRegionCodeMap() {
// The capacity is set to 285 as there are 214 different country codes,
// The capacity is set to 286 as there are 215 different country codes,
// and this offers a load factor of roughly 0.75. // and this offers a load factor of roughly 0.75.
Map<Integer, List<String>> countryCodeToRegionCodeMap = Map<Integer, List<String>> countryCodeToRegionCodeMap =
new HashMap<Integer, List<String>>(285);
new HashMap<Integer, List<String>>(286);
ArrayList<String> listWithRegionCode; ArrayList<String> listWithRegionCode;
@ -823,6 +823,10 @@ public class CountryCodeToRegionCodeMap {
listWithRegionCode.add("001"); listWithRegionCode.add("001");
countryCodeToRegionCodeMap.put(881, listWithRegionCode); countryCodeToRegionCodeMap.put(881, listWithRegionCode);
listWithRegionCode = new ArrayList<String>(1);
listWithRegionCode.add("001");
countryCodeToRegionCodeMap.put(882, listWithRegionCode);
listWithRegionCode = new ArrayList<String>(1); listWithRegionCode = new ArrayList<String>(1);
listWithRegionCode.add("001"); listWithRegionCode.add("001");
countryCodeToRegionCodeMap.put(883, listWithRegionCode); countryCodeToRegionCodeMap.put(883, listWithRegionCode);


+ 57
- 27
java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java View File

@ -59,7 +59,7 @@ public class PhoneNumberUtil {
/** Flags to use when compiling regular expressions for phone numbers. */ /** Flags to use when compiling regular expressions for phone numbers. */
static final int REGEX_FLAGS = Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE; static final int REGEX_FLAGS = Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE;
// The minimum and maximum length of the national significant number. // The minimum and maximum length of the national significant number.
private static final int MIN_LENGTH_FOR_NSN = 3;
private static final int MIN_LENGTH_FOR_NSN = 2;
// The ITU says the maximum length should be 15, but we have found longer numbers in Germany. // The ITU says the maximum length should be 15, but we have found longer numbers in Germany.
static final int MAX_LENGTH_FOR_NSN = 16; static final int MAX_LENGTH_FOR_NSN = 16;
// The maximum length of the country calling code. // The maximum length of the country calling code.
@ -103,9 +103,8 @@ public class PhoneNumberUtil {
private static final String RFC3966_EXTN_PREFIX = ";ext="; private static final String RFC3966_EXTN_PREFIX = ";ext=";
private static final String RFC3966_PREFIX = "tel:"; private static final String RFC3966_PREFIX = "tel:";
// We include the "+" here since RFC3966 format specifies that the context must be specified in
// international format.
private static final String RFC3966_PHONE_CONTEXT = ";phone-context=+";
private static final String RFC3966_PHONE_CONTEXT = ";phone-context=";
private static final String RFC3966_ISDN_SUBADDRESS = ";isub=";
// A map that contains characters that are essential when dialling. That means any of the // A map that contains characters that are essential when dialling. That means any of the
// characters in this map must not be removed from a number when dialing, otherwise the call will // characters in this map must not be removed from a number when dialing, otherwise the call will
@ -173,7 +172,7 @@ public class PhoneNumberUtil {
HashMap<Character, Character> diallableCharMap = new HashMap<Character, Character>(); HashMap<Character, Character> diallableCharMap = new HashMap<Character, Character>();
diallableCharMap.putAll(asciiDigitMappings); diallableCharMap.putAll(asciiDigitMappings);
diallableCharMap.put('+', '+');
diallableCharMap.put(PLUS_SIGN, PLUS_SIGN);
diallableCharMap.put('*', '*'); diallableCharMap.put('*', '*');
DIALLABLE_CHAR_MAPPINGS = Collections.unmodifiableMap(diallableCharMap); DIALLABLE_CHAR_MAPPINGS = Collections.unmodifiableMap(diallableCharMap);
@ -220,7 +219,7 @@ public class PhoneNumberUtil {
// placeholder for carrier information in some phone numbers. Full-width variants are also // placeholder for carrier information in some phone numbers. Full-width variants are also
// present. // present.
static final String VALID_PUNCTUATION = "-x\u2010-\u2015\u2212\u30FC\uFF0D-\uFF0F " + static final String VALID_PUNCTUATION = "-x\u2010-\u2015\u2212\u30FC\uFF0D-\uFF0F " +
"\u00A0\u200B\u2060\u3000()\uFF08\uFF09\uFF3B\uFF3D.\\[\\]/~\u2053\u223C\uFF5E";
"\u00A0\u00AD\u200B\u2060\u3000()\uFF08\uFF09\uFF3B\uFF3D.\\[\\]/~\u2053\u223C\uFF5E";
private static final String DIGITS = "\\p{Nd}"; private static final String DIGITS = "\\p{Nd}";
// We accept alpha characters in phone numbers, ASCII only, upper and lower case. // We accept alpha characters in phone numbers, ASCII only, upper and lower case.
@ -618,7 +617,7 @@ public class PhoneNumberUtil {
/** /**
* Checks to see if the string of characters could possibly be a phone number at all. At the * Checks to see if the string of characters could possibly be a phone number at all. At the
* moment, checks to see that the string begins with at least 3 digits, ignoring any punctuation
* moment, checks to see that the string begins with at least 2 digits, ignoring any punctuation
* commonly found in phone numbers. * commonly found in phone numbers.
* This method does not require the number to be normalized in advance - but does assume that * This method does not require the number to be normalized in advance - but does assume that
* leading non-number symbols have been removed, such as by the method extractPossibleNumber. * leading non-number symbols have been removed, such as by the method extractPossibleNumber.
@ -1342,7 +1341,9 @@ public class PhoneNumberUtil {
// If no digit is inserted/removed/modified as a result of our formatting, we return the // If no digit is inserted/removed/modified as a result of our formatting, we return the
// formatted phone number; otherwise we return the raw input the user entered. // formatted phone number; otherwise we return the raw input the user entered.
return (formattedNumber != null && return (formattedNumber != null &&
normalizeDigitsOnly(formattedNumber).equals(normalizeDigitsOnly(rawInput)))
normalizeHelper(formattedNumber, DIALLABLE_CHAR_MAPPINGS, true /* remove non matches */)
.equals(normalizeHelper(
rawInput, DIALLABLE_CHAR_MAPPINGS, true /* remove non matches */)))
? formattedNumber ? formattedNumber
: rawInput; : rawInput;
} }
@ -2273,7 +2274,7 @@ public class PhoneNumberUtil {
phoneNumber.setCountryCodeSource(countryCodeSource); phoneNumber.setCountryCodeSource(countryCodeSource);
} }
if (countryCodeSource != CountryCodeSource.FROM_DEFAULT_COUNTRY) { if (countryCodeSource != CountryCodeSource.FROM_DEFAULT_COUNTRY) {
if (fullNumber.length() < MIN_LENGTH_FOR_NSN) {
if (fullNumber.length() <= MIN_LENGTH_FOR_NSN) {
throw new NumberParseException(NumberParseException.ErrorType.TOO_SHORT_AFTER_IDD, throw new NumberParseException(NumberParseException.ErrorType.TOO_SHORT_AFTER_IDD,
"Phone number had an IDD, but after this was not " "Phone number had an IDD, but after this was not "
+ "long enough to be a viable phone number."); + "long enough to be a viable phone number.");
@ -2495,7 +2496,8 @@ public class PhoneNumberUtil {
* particular region is not performed. This can be done separately with {@link #isValidNumber}. * particular region is not performed. This can be done separately with {@link #isValidNumber}.
* *
* @param numberToParse number that we are attempting to parse. This can contain formatting * @param numberToParse number that we are attempting to parse. This can contain formatting
* such as +, ( and -, as well as a phone number extension.
* such as +, ( and -, as well as a phone number extension. It can also
* be provided in RFC3966 format.
* @param defaultRegion region that we are expecting the number to be from. This is only used * @param defaultRegion region that we are expecting the number to be from. This is only used
* if the number being parsed is not written in international format. * if the number being parsed is not written in international format.
* The country_code for the number in this case would be stored as that * The country_code for the number in this case would be stored as that
@ -2614,24 +2616,8 @@ public class PhoneNumberUtil {
"The string supplied was too long to parse."); "The string supplied was too long to parse.");
} }
int indexOfPhoneContext = numberToParse.indexOf(RFC3966_PHONE_CONTEXT);
StringBuilder nationalNumber = new StringBuilder(); StringBuilder nationalNumber = new StringBuilder();
if (indexOfPhoneContext > 0) {
// Prefix the number with the phone context. The offset here is because the context we are
// expecting to match should start with a "+" sign, and we want to include this at the start
// of the number.
nationalNumber.append(numberToParse.substring(indexOfPhoneContext +
RFC3966_PHONE_CONTEXT.length() - 1));
// Now append everything between the "tel:" prefix and the phone-context.
nationalNumber.append(numberToParse.substring(
numberToParse.indexOf(RFC3966_PREFIX) + RFC3966_PREFIX.length(), indexOfPhoneContext));
// Note that phone-contexts that are URLs will not be parsed - isViablePhoneNumber will throw
// an exception below.
} else {
// Extract a possible number from the string passed in (this strips leading characters that
// could not be the start of a phone number.)
nationalNumber.append(extractPossibleNumber(numberToParse));
}
buildNationalNumberForParsing(numberToParse, nationalNumber);
if (!isViablePhoneNumber(nationalNumber.toString())) { if (!isViablePhoneNumber(nationalNumber.toString())) {
throw new NumberParseException(NumberParseException.ErrorType.NOT_A_NUMBER, throw new NumberParseException(NumberParseException.ErrorType.NOT_A_NUMBER,
@ -2725,6 +2711,50 @@ public class PhoneNumberUtil {
phoneNumber.setNationalNumber(Long.parseLong(normalizedNationalNumber.toString())); phoneNumber.setNationalNumber(Long.parseLong(normalizedNationalNumber.toString()));
} }
/**
* Converts numberToParse to a form that we can parse and write it to nationalNumber if it is
* written in RFC3966; otherwise extract a possible number out of it and write to nationalNumber.
*/
private void buildNationalNumberForParsing(String numberToParse, StringBuilder nationalNumber) {
int indexOfPhoneContext = numberToParse.indexOf(RFC3966_PHONE_CONTEXT);
if (indexOfPhoneContext > 0) {
int phoneContextStart = indexOfPhoneContext + RFC3966_PHONE_CONTEXT.length();
// If the phone context contains a phone number prefix, we need to capture it, whereas domains
// will be ignored.
if (numberToParse.charAt(phoneContextStart) == PLUS_SIGN) {
// Additional parameters might follow the phone context. If so, we will remove them here
// because the parameters after phone context are not important for parsing the
// phone number.
int phoneContextEnd = numberToParse.indexOf(';', phoneContextStart);
if (phoneContextEnd > 0) {
nationalNumber.append(numberToParse.substring(phoneContextStart, phoneContextEnd));
} else {
nationalNumber.append(numberToParse.substring(phoneContextStart));
}
}
// Now append everything between the "tel:" prefix and the phone-context. This should include
// the national number, an optional extension or isdn-subaddress component.
nationalNumber.append(numberToParse.substring(
numberToParse.indexOf(RFC3966_PREFIX) + RFC3966_PREFIX.length(), indexOfPhoneContext));
} else {
// Extract a possible number from the string passed in (this strips leading characters that
// could not be the start of a phone number.)
nationalNumber.append(extractPossibleNumber(numberToParse));
}
// Delete the isdn-subaddress and everything after it if it is present. Note extension won't
// appear at the same time with isdn-subaddress according to paragraph 5.3 of the RFC3966 spec,
int indexOfIsdn = nationalNumber.indexOf(RFC3966_ISDN_SUBADDRESS);
if (indexOfIsdn > 0) {
nationalNumber.delete(indexOfIsdn, nationalNumber.length());
}
// If both phone context and isdn-subaddress are absent but other parameters are present, the
// parameters are left in nationalNumber. This is because we are concerned about deleting
// content from a potential number string when there is no strong evidence that the number is
// actually written in RFC3966.
}
/** /**
* Takes two phone numbers and compares them for equality. * Takes two phone numbers and compares them for equality.
* *


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_882 View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CZ View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ES View File


BIN
java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW View File


+ 6
- 2
java/libphonenumber/test/com/google/i18n/phonenumbers/CountryCodeToRegionCodeMapForTesting.java View File

@ -31,10 +31,10 @@ public class CountryCodeToRegionCodeMapForTesting {
// countries sharing a calling code, such as the NANPA countries, the one // countries sharing a calling code, such as the NANPA countries, the one
// indicated with "isMainCountryForCode" in the metadata should be first. // indicated with "isMainCountryForCode" in the metadata should be first.
static Map<Integer, List<String>> getCountryCodeToRegionCodeMap() { static Map<Integer, List<String>> getCountryCodeToRegionCodeMap() {
// The capacity is set to 22 as there are 17 different country codes,
// The capacity is set to 24 as there are 18 different country codes,
// and this offers a load factor of roughly 0.75. // and this offers a load factor of roughly 0.75.
Map<Integer, List<String>> countryCodeToRegionCodeMap = Map<Integer, List<String>> countryCodeToRegionCodeMap =
new HashMap<Integer, List<String>>(22);
new HashMap<Integer, List<String>>(24);
ArrayList<String> listWithRegionCode; ArrayList<String> listWithRegionCode;
@ -108,6 +108,10 @@ public class CountryCodeToRegionCodeMapForTesting {
listWithRegionCode.add("001"); listWithRegionCode.add("001");
countryCodeToRegionCodeMap.put(800, listWithRegionCode); countryCodeToRegionCodeMap.put(800, listWithRegionCode);
listWithRegionCode = new ArrayList<String>(1);
listWithRegionCode.add("001");
countryCodeToRegionCodeMap.put(979, listWithRegionCode);
return countryCodeToRegionCodeMap; return countryCodeToRegionCodeMap;
} }
} }

+ 2
- 3
java/libphonenumber/test/com/google/i18n/phonenumbers/ExampleNumbersTest.java View File

@ -176,9 +176,8 @@ public class ExampleNumbersTest extends TestCase {
assertEquals(0, wrongTypeCases.size()); assertEquals(0, wrongTypeCases.size());
} }
// TODO: Update this to use connectsToEmergencyNumber or similar once that is
// implemented.
public void testEmergency() throws Exception { public void testEmergency() throws Exception {
ShortNumberUtil shortUtil = new ShortNumberUtil(phoneNumberUtil);
int wrongTypeCounter = 0; int wrongTypeCounter = 0;
for (String regionCode : phoneNumberUtil.getSupportedRegions()) { for (String regionCode : phoneNumberUtil.getSupportedRegions()) {
PhoneNumberDesc desc = PhoneNumberDesc desc =
@ -186,7 +185,7 @@ public class ExampleNumbersTest extends TestCase {
if (desc.hasExampleNumber()) { if (desc.hasExampleNumber()) {
String exampleNumber = desc.getExampleNumber(); String exampleNumber = desc.getExampleNumber();
if (!exampleNumber.matches(desc.getPossibleNumberPattern()) || if (!exampleNumber.matches(desc.getPossibleNumberPattern()) ||
!exampleNumber.matches(desc.getNationalNumberPattern())) {
!shortUtil.isEmergencyNumber(exampleNumber, regionCode)) {
wrongTypeCounter++; wrongTypeCounter++;
LOGGER.log(Level.SEVERE, "Emergency example number test failed for " + regionCode); LOGGER.log(Level.SEVERE, "Emergency example number test failed for " + regionCode);
} }


+ 71
- 17
java/libphonenumber/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java View File

@ -99,8 +99,13 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase {
.setRawInput("000-000-0000"); .setRawInput("000-000-0000");
private static final PhoneNumber INTERNATIONAL_TOLL_FREE = private static final PhoneNumber INTERNATIONAL_TOLL_FREE =
new PhoneNumber().setCountryCode(800).setNationalNumber(12345678L); new PhoneNumber().setCountryCode(800).setNationalNumber(12345678L);
// We set this to be the same length as numbers for the other non-geographical country prefix that
// we have in our test metadata. However, this is not considered valid because they differ in
// their country calling code.
private static final PhoneNumber INTERNATIONAL_TOLL_FREE_TOO_LONG = private static final PhoneNumber INTERNATIONAL_TOLL_FREE_TOO_LONG =
new PhoneNumber().setCountryCode(800).setNationalNumber(1234567890L);
new PhoneNumber().setCountryCode(800).setNationalNumber(123456789L);
private static final PhoneNumber UNIVERSAL_PREMIUM_RATE =
new PhoneNumber().setCountryCode(979).setNationalNumber(123456789L);
public void testGetSupportedRegions() { public void testGetSupportedRegions() {
assertTrue(phoneUtil.getSupportedRegions().size() > 0); assertTrue(phoneUtil.getSupportedRegions().size() > 0);
@ -286,6 +291,7 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase {
public void testGetExampleNumberForNonGeoEntity() { public void testGetExampleNumberForNonGeoEntity() {
assertEquals(INTERNATIONAL_TOLL_FREE, phoneUtil.getExampleNumberForNonGeoEntity(800)); assertEquals(INTERNATIONAL_TOLL_FREE, phoneUtil.getExampleNumberForNonGeoEntity(800));
assertEquals(UNIVERSAL_PREMIUM_RATE, phoneUtil.getExampleNumberForNonGeoEntity(979));
} }
public void testConvertAlphaCharactersInNumber() { public void testConvertAlphaCharactersInNumber() {
@ -296,7 +302,7 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase {
} }
public void testNormaliseRemovePunctuation() { public void testNormaliseRemovePunctuation() {
String inputNumber = "034-56&+#234";
String inputNumber = "034-56&+#2\u00AD34";
String expectedOutput = "03456234"; String expectedOutput = "03456234";
assertEquals("Conversion did not correctly remove punctuation", assertEquals("Conversion did not correctly remove punctuation",
expectedOutput, expectedOutput,
@ -868,6 +874,12 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase {
phoneUtil.parseAndKeepRawInput("0011 16502530000", RegionCode.AU); phoneUtil.parseAndKeepRawInput("0011 16502530000", RegionCode.AU);
assertEquals("0011 1 650 253 0000", assertEquals("0011 1 650 253 0000",
phoneUtil.formatInOriginalFormat(outOfCountryNumberFromAU2, RegionCode.AU)); phoneUtil.formatInOriginalFormat(outOfCountryNumberFromAU2, RegionCode.AU));
// Test the star sign is not removed from or added to the original input by this method.
PhoneNumber starNumber = phoneUtil.parseAndKeepRawInput("*1234", RegionCode.JP);
assertEquals("*1234", phoneUtil.formatInOriginalFormat(starNumber, RegionCode.JP));
PhoneNumber numberWithoutStar = phoneUtil.parseAndKeepRawInput("1234", RegionCode.JP);
assertEquals("1234", phoneUtil.formatInOriginalFormat(numberWithoutStar, RegionCode.JP));
} }
public void testIsPremiumRate() { public void testIsPremiumRate() {
@ -892,6 +904,9 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase {
premiumRateNumber.setCountryCode(49).setNationalNumber(90091234567L); premiumRateNumber.setCountryCode(49).setNationalNumber(90091234567L);
assertEquals(PhoneNumberUtil.PhoneNumberType.PREMIUM_RATE, assertEquals(PhoneNumberUtil.PhoneNumberType.PREMIUM_RATE,
phoneUtil.getNumberType(premiumRateNumber)); phoneUtil.getNumberType(premiumRateNumber));
assertEquals(PhoneNumberUtil.PhoneNumberType.PREMIUM_RATE,
phoneUtil.getNumberType(UNIVERSAL_PREMIUM_RATE));
} }
public void testIsTollFree() { public void testIsTollFree() {
@ -977,6 +992,7 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase {
assertTrue(phoneUtil.isValidNumber(IT_NUMBER)); assertTrue(phoneUtil.isValidNumber(IT_NUMBER));
assertTrue(phoneUtil.isValidNumber(GB_MOBILE)); assertTrue(phoneUtil.isValidNumber(GB_MOBILE));
assertTrue(phoneUtil.isValidNumber(INTERNATIONAL_TOLL_FREE)); assertTrue(phoneUtil.isValidNumber(INTERNATIONAL_TOLL_FREE));
assertTrue(phoneUtil.isValidNumber(UNIVERSAL_PREMIUM_RATE));
PhoneNumber nzNumber = new PhoneNumber().setCountryCode(64).setNationalNumber(21387835L); PhoneNumber nzNumber = new PhoneNumber().setCountryCode(64).setNationalNumber(21387835L);
assertTrue(phoneUtil.isValidNumber(nzNumber)); assertTrue(phoneUtil.isValidNumber(nzNumber));
@ -1061,6 +1077,7 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase {
assertEquals(RegionCode.GB, phoneUtil.getRegionCodeForCountryCode(44)); assertEquals(RegionCode.GB, phoneUtil.getRegionCodeForCountryCode(44));
assertEquals(RegionCode.DE, phoneUtil.getRegionCodeForCountryCode(49)); assertEquals(RegionCode.DE, phoneUtil.getRegionCodeForCountryCode(49));
assertEquals(RegionCode.UN001, phoneUtil.getRegionCodeForCountryCode(800)); assertEquals(RegionCode.UN001, phoneUtil.getRegionCodeForCountryCode(800));
assertEquals(RegionCode.UN001, phoneUtil.getRegionCodeForCountryCode(979));
} }
public void testGetRegionCodeForNumber() { public void testGetRegionCodeForNumber() {
@ -1068,6 +1085,7 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase {
assertEquals(RegionCode.US, phoneUtil.getRegionCodeForNumber(US_NUMBER)); assertEquals(RegionCode.US, phoneUtil.getRegionCodeForNumber(US_NUMBER));
assertEquals(RegionCode.GB, phoneUtil.getRegionCodeForNumber(GB_MOBILE)); assertEquals(RegionCode.GB, phoneUtil.getRegionCodeForNumber(GB_MOBILE));
assertEquals(RegionCode.UN001, phoneUtil.getRegionCodeForNumber(INTERNATIONAL_TOLL_FREE)); assertEquals(RegionCode.UN001, phoneUtil.getRegionCodeForNumber(INTERNATIONAL_TOLL_FREE));
assertEquals(RegionCode.UN001, phoneUtil.getRegionCodeForNumber(UNIVERSAL_PREMIUM_RATE));
} }
public void testGetCountryCodeForRegion() { public void testGetCountryCodeForRegion() {
@ -1158,7 +1176,7 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase {
adNumber.setCountryCode(376).setNationalNumber(12345L); adNumber.setCountryCode(376).setNationalNumber(12345L);
assertEquals(PhoneNumberUtil.ValidationResult.IS_POSSIBLE, assertEquals(PhoneNumberUtil.ValidationResult.IS_POSSIBLE,
phoneUtil.isPossibleNumberWithReason(adNumber)); phoneUtil.isPossibleNumberWithReason(adNumber));
adNumber.setCountryCode(376).setNationalNumber(13L);
adNumber.setCountryCode(376).setNationalNumber(1L);
assertEquals(PhoneNumberUtil.ValidationResult.TOO_SHORT, assertEquals(PhoneNumberUtil.ValidationResult.TOO_SHORT,
phoneUtil.isPossibleNumberWithReason(adNumber)); phoneUtil.isPossibleNumberWithReason(adNumber));
adNumber.setCountryCode(376).setNationalNumber(12345678901234567L); adNumber.setCountryCode(376).setNationalNumber(12345678901234567L);
@ -1535,7 +1553,14 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase {
assertEquals(NZ_NUMBER, phoneUtil.parse("tel:03-331-6005;phone-context=+64", RegionCode.NZ)); assertEquals(NZ_NUMBER, phoneUtil.parse("tel:03-331-6005;phone-context=+64", RegionCode.NZ));
assertEquals(NZ_NUMBER, phoneUtil.parse("tel:331-6005;phone-context=+64-3", RegionCode.NZ)); assertEquals(NZ_NUMBER, phoneUtil.parse("tel:331-6005;phone-context=+64-3", RegionCode.NZ));
assertEquals(NZ_NUMBER, phoneUtil.parse("tel:331-6005;phone-context=+64-3", RegionCode.US)); assertEquals(NZ_NUMBER, phoneUtil.parse("tel:331-6005;phone-context=+64-3", RegionCode.US));
// Test parsing RFC3966 format with optional user-defined parameters. The parameters will appear
// after the context if present.
assertEquals(NZ_NUMBER, phoneUtil.parse("tel:03-331-6005;phone-context=+64;a=%A1",
RegionCode.NZ));
// Test parsing RFC3966 with an ISDN subaddress.
assertEquals(NZ_NUMBER, phoneUtil.parse("tel:03-331-6005;isub=12345;phone-context=+64",
RegionCode.NZ));
assertEquals(NZ_NUMBER, phoneUtil.parse("tel:+64-3-331-6005;isub=12345", RegionCode.NZ));
// Testing international prefixes. // Testing international prefixes.
// Should strip country calling code. // Should strip country calling code.
assertEquals(NZ_NUMBER, phoneUtil.parse("0064 3 331 6005", RegionCode.NZ)); assertEquals(NZ_NUMBER, phoneUtil.parse("0064 3 331 6005", RegionCode.NZ));
@ -1549,6 +1574,17 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase {
assertEquals(NZ_NUMBER, phoneUtil.parse("+0064 3 331 6005", RegionCode.NZ)); assertEquals(NZ_NUMBER, phoneUtil.parse("+0064 3 331 6005", RegionCode.NZ));
assertEquals(NZ_NUMBER, phoneUtil.parse("+ 00 64 3 331 6005", RegionCode.NZ)); assertEquals(NZ_NUMBER, phoneUtil.parse("+ 00 64 3 331 6005", RegionCode.NZ));
assertEquals(US_LOCAL_NUMBER,
phoneUtil.parse("tel:253-0000;phone-context=www.google.com", RegionCode.US));
assertEquals(US_LOCAL_NUMBER,
phoneUtil.parse("tel:253-0000;isub=12345;phone-context=www.google.com", RegionCode.US));
// This is invalid because no "+" sign is present as part of phone-context. The phone context
// is simply ignored in this case just as if it contains a domain.
assertEquals(US_LOCAL_NUMBER,
phoneUtil.parse("tel:2530000;isub=12345;phone-context=1-650", RegionCode.US));
assertEquals(US_LOCAL_NUMBER,
phoneUtil.parse("tel:2530000;isub=12345;phone-context=1234.com", RegionCode.US));
PhoneNumber nzNumber = new PhoneNumber(); PhoneNumber nzNumber = new PhoneNumber();
nzNumber.setCountryCode(64).setNationalNumber(64123456L); nzNumber.setCountryCode(64).setNationalNumber(64123456L);
assertEquals(nzNumber, phoneUtil.parse("64(0)64123456", RegionCode.NZ)); assertEquals(nzNumber, phoneUtil.parse("64(0)64123456", RegionCode.NZ));
@ -1633,6 +1669,8 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase {
public void testParseNonAscii() throws Exception { public void testParseNonAscii() throws Exception {
// Using a full-width plus sign. // Using a full-width plus sign.
assertEquals(US_NUMBER, phoneUtil.parse("\uFF0B1 (650) 253-0000", RegionCode.SG)); assertEquals(US_NUMBER, phoneUtil.parse("\uFF0B1 (650) 253-0000", RegionCode.SG));
// Using a soft hyphen U+00AD.
assertEquals(US_NUMBER, phoneUtil.parse("1 (650) 253\u00AD-0000", RegionCode.US));
// The whole number, including punctuation, is here represented in full-width form. // The whole number, including punctuation, is here represented in full-width form.
assertEquals(US_NUMBER, phoneUtil.parse("\uFF0B\uFF11\u3000\uFF08\uFF16\uFF15\uFF10\uFF09" + assertEquals(US_NUMBER, phoneUtil.parse("\uFF0B\uFF11\u3000\uFF08\uFF16\uFF15\uFF10\uFF09" +
"\u3000\uFF12\uFF15\uFF13\uFF0D\uFF10\uFF10\uFF10" + "\u3000\uFF12\uFF15\uFF13\uFF0D\uFF10\uFF10\uFF10" +
@ -1904,31 +1942,26 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase {
fail("Null string - but should not throw a null pointer exception."); fail("Null string - but should not throw a null pointer exception.");
} }
try { try {
String domainRfcPhoneContext = "tel:555-1234;phone-context:www.google.com";
phoneUtil.parse(domainRfcPhoneContext, RegionCode.US);
fail("Domain provided for phone context - should fail.");
String domainRfcPhoneContext = "tel:555-1234;phone-context=www.google.com";
phoneUtil.parse(domainRfcPhoneContext, RegionCode.ZZ);
fail("'Unknown' region code not allowed: should fail.");
} catch (NumberParseException e) { } catch (NumberParseException e) {
// Expected this exception. // Expected this exception.
assertEquals("Wrong error type stored in exception.", assertEquals("Wrong error type stored in exception.",
NumberParseException.ErrorType.NOT_A_NUMBER,
NumberParseException.ErrorType.INVALID_COUNTRY_CODE,
e.getErrorType()); e.getErrorType());
} catch (NullPointerException e) {
fail("Domain provided for phone context - but should not throw a null pointer exception.");
} }
try { try {
// This is invalid because no "+" sign is present as part of phone-context. This should not // This is invalid because no "+" sign is present as part of phone-context. This should not
// succeed in being parsed. // succeed in being parsed.
String invalidRfcPhoneContext = "tel:555-1234;phone-context:1-331";
phoneUtil.parse(invalidRfcPhoneContext, RegionCode.US);
fail("No leading plus provided in phone context - should fail.");
String invalidRfcPhoneContext = "tel:555-1234;phone-context=1-331";
phoneUtil.parse(invalidRfcPhoneContext, RegionCode.ZZ);
fail("'Unknown' region code not allowed: should fail.");
} catch (NumberParseException e) { } catch (NumberParseException e) {
// Expected this exception. // Expected this exception.
assertEquals("Wrong error type stored in exception.", assertEquals("Wrong error type stored in exception.",
NumberParseException.ErrorType.NOT_A_NUMBER,
NumberParseException.ErrorType.INVALID_COUNTRY_CODE,
e.getErrorType()); e.getErrorType());
} catch (NullPointerException e) {
fail("No leading plus provided in phone context - but should not throw a null pointer " +
"exception.");
} }
} }
@ -1942,10 +1975,13 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase {
assertEquals(NZ_NUMBER, phoneUtil.parse("Tel: +64 3 331 6005", RegionCode.ZZ)); assertEquals(NZ_NUMBER, phoneUtil.parse("Tel: +64 3 331 6005", RegionCode.ZZ));
assertEquals(NZ_NUMBER, phoneUtil.parse("+64 3 331 6005", null)); assertEquals(NZ_NUMBER, phoneUtil.parse("+64 3 331 6005", null));
assertEquals(INTERNATIONAL_TOLL_FREE, phoneUtil.parse("+800 1234 5678", null)); assertEquals(INTERNATIONAL_TOLL_FREE, phoneUtil.parse("+800 1234 5678", null));
assertEquals(UNIVERSAL_PREMIUM_RATE, phoneUtil.parse("+979 123 456 789", null));
// Test parsing RFC3966 format with a phone context. // Test parsing RFC3966 format with a phone context.
assertEquals(NZ_NUMBER, phoneUtil.parse("tel:03-331-6005;phone-context=+64", RegionCode.ZZ)); assertEquals(NZ_NUMBER, phoneUtil.parse("tel:03-331-6005;phone-context=+64", RegionCode.ZZ));
assertEquals(NZ_NUMBER, phoneUtil.parse(" tel:03-331-6005;phone-context=+64", RegionCode.ZZ)); assertEquals(NZ_NUMBER, phoneUtil.parse(" tel:03-331-6005;phone-context=+64", RegionCode.ZZ));
assertEquals(NZ_NUMBER, phoneUtil.parse("tel:03-331-6005;isub=12345;phone-context=+64",
RegionCode.ZZ));
// It is important that we set the carrier code to an empty string, since we used // It is important that we set the carrier code to an empty string, since we used
// ParseAndKeepRawInput and no carrier code was found. // ParseAndKeepRawInput and no carrier code was found.
@ -2112,6 +2148,8 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase {
phoneUtil.isNumberMatch("+643 331-6005", "+6433316005")); phoneUtil.isNumberMatch("+643 331-6005", "+6433316005"));
assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH, assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH,
phoneUtil.isNumberMatch("+64 3 331-6005", "+6433316005")); phoneUtil.isNumberMatch("+64 3 331-6005", "+6433316005"));
assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH,
phoneUtil.isNumberMatch("+64 3 331-6005", "tel:+64-3-331-6005;isub=123"));
// Test alpha numbers. // Test alpha numbers.
assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH, assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH,
phoneUtil.isNumberMatch("+1800 siX-Flags", "+1 800 7493 5247")); phoneUtil.isNumberMatch("+1800 siX-Flags", "+1 800 7493 5247"));
@ -2162,6 +2200,9 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase {
// Extension different, all else the same. // Extension different, all else the same.
assertEquals(PhoneNumberUtil.MatchType.NO_MATCH, assertEquals(PhoneNumberUtil.MatchType.NO_MATCH,
phoneUtil.isNumberMatch("+64 3 331-6005 extn 1234", "0116433316005#1235")); phoneUtil.isNumberMatch("+64 3 331-6005 extn 1234", "0116433316005#1235"));
assertEquals(PhoneNumberUtil.MatchType.NO_MATCH,
phoneUtil.isNumberMatch(
"+64 3 331-6005 extn 1234", "tel:+64-3-331-6005;ext=1235"));
// NSN matches, but extension is different - not the same number. // NSN matches, but extension is different - not the same number.
assertEquals(PhoneNumberUtil.MatchType.NO_MATCH, assertEquals(PhoneNumberUtil.MatchType.NO_MATCH,
phoneUtil.isNumberMatch("+64 3 331-6005 ext.1235", "3 331 6005#1234")); phoneUtil.isNumberMatch("+64 3 331-6005 ext.1235", "3 331 6005#1234"));
@ -2181,6 +2222,9 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase {
// NSN matches. // NSN matches.
assertEquals(PhoneNumberUtil.MatchType.NSN_MATCH, assertEquals(PhoneNumberUtil.MatchType.NSN_MATCH,
phoneUtil.isNumberMatch("+64 3 331-6005", "03 331 6005")); phoneUtil.isNumberMatch("+64 3 331-6005", "03 331 6005"));
assertEquals(PhoneNumberUtil.MatchType.NSN_MATCH,
phoneUtil.isNumberMatch(
"+64 3 331-6005", "tel:03-331-6005;isub=1234;phone-context=abc.nz"));
assertEquals(PhoneNumberUtil.MatchType.NSN_MATCH, assertEquals(PhoneNumberUtil.MatchType.NSN_MATCH,
phoneUtil.isNumberMatch(NZ_NUMBER, "03 331 6005")); phoneUtil.isNumberMatch(NZ_NUMBER, "03 331 6005"));
// Here the second number possibly starts with the country calling code for New Zealand, // Here the second number possibly starts with the country calling code for New Zealand,
@ -2215,12 +2259,22 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase {
// Short NSN matches with the country not specified for either one or both numbers. // Short NSN matches with the country not specified for either one or both numbers.
assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH, assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH,
phoneUtil.isNumberMatch("+64 3 331-6005", "331 6005")); phoneUtil.isNumberMatch("+64 3 331-6005", "331 6005"));
assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH,
phoneUtil.isNumberMatch("+64 3 331-6005", "tel:331-6005;phone-context=abc.nz"));
assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH,
phoneUtil.isNumberMatch("+64 3 331-6005",
"tel:331-6005;isub=1234;phone-context=abc.nz"));
assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH,
phoneUtil.isNumberMatch("+64 3 331-6005",
"tel:331-6005;isub=1234;phone-context=abc.nz;a=%A1"));
// We did not know that the "0" was a national prefix since neither number has a country code, // We did not know that the "0" was a national prefix since neither number has a country code,
// so this is considered a SHORT_NSN_MATCH. // so this is considered a SHORT_NSN_MATCH.
assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH, assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH,
phoneUtil.isNumberMatch("3 331-6005", "03 331 6005")); phoneUtil.isNumberMatch("3 331-6005", "03 331 6005"));
assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH, assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH,
phoneUtil.isNumberMatch("3 331-6005", "331 6005")); phoneUtil.isNumberMatch("3 331-6005", "331 6005"));
assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH,
phoneUtil.isNumberMatch("3 331-6005", "tel:331-6005;phone-context=abc.nz"));
assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH, assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH,
phoneUtil.isNumberMatch("3 331-6005", "+64 331 6005")); phoneUtil.isNumberMatch("3 331-6005", "+64 331 6005"));
// Short NSN match with the country specified. // Short NSN match with the country specified.


BIN
java/libphonenumber/test/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_979 View File


+ 20
- 1
java/release_notes.txt View File

@ -1,8 +1,27 @@
June 21st, 2012: libphonenumber-4.9
* Bug fix
- formatInOriginalFormat fixed not to add a star sign if it was not present
originally.
* Metadata changes
- BF, CZ, ES, KW
- Non-geographical entities with calling code 882 (BebbiCell, Maritime
Communications, Oration Technologies, Telespazio and Thuraya)
- Geocoding data updates for country calling codes 221, 224, 226, 242, 244, 245
* Functionality changes:
- Minimum allowed length for a national significant number (NSN) when parsing
changed from 3 to 2.
- Support parsing of RFC3966-formatted strings with an isdn-subaddress or extra
parameters specified.
- Allow soft hyphen to appear in phone numbers (\u00AD)
* Testing changes:
- Add extra unit tests for non-geographical phone number entities
- ExampleNumbersTest testEmergency tests now uses ShortNumberUtil
June 14th, 2012: libphonenumber-4.8.5 June 14th, 2012: libphonenumber-4.8.5
* Metadata update only: * Metadata update only:
- AC, CR, DE, DK, IL, IN, IS, KH, LI, LR, MA, MD, MK, PA, SA, SG, SS - AC, CR, DE, DK, IL, IN, IS, KH, LI, LR, MA, MD, MK, PA, SA, SG, SS
June 5th, 2012: libphonenumber-4.8.4
June 6th, 2012: libphonenumber-4.8.4
* Metadata update only: * Metadata update only:
- AE, RO - AE, RO
- Non-geographical entity with calling code 881 (Iridium) - Non-geographical entity with calling code 881 (Iridium)


+ 199
- 44
resources/PhoneNumberMetaData.xml View File

@ -2433,8 +2433,9 @@
<nationalNumberPattern> <nationalNumberPattern>
(?: (?:
6(?: 6(?:
0[0-5]|
[68]0
0[0-7]|
6[0-2]|
8[01]
)| )|
7(?: 7(?:
[02-68]\d| [02-68]\d|
@ -5169,12 +5170,27 @@
<territory id="CZ" countryCode="420" internationalPrefix="00"> <territory id="CZ" countryCode="420" internationalPrefix="00">
<availableFormats> <availableFormats>
<numberFormat pattern="([2-9]\d{2})(\d{3})(\d{3})"> <numberFormat pattern="([2-9]\d{2})(\d{3})(\d{3})">
<leadingDigits>
[2-8]|
9[015-7]
</leadingDigits>
<format>$1 $2 $3</format> <format>$1 $2 $3</format>
</numberFormat> </numberFormat>
<numberFormat pattern="(96\d)(\d{3})(\d{3})(\d{3})">
<leadingDigits>96</leadingDigits>
<format>$1 $2 $3 $4</format>
</numberFormat>
<numberFormat pattern="(9\d)(\d{3})(\d{3})(\d{3})">
<leadingDigits>9[36]</leadingDigits>
<format>$1 $2 $3 $4</format>
</numberFormat>
</availableFormats> </availableFormats>
<generalDesc> <generalDesc>
<nationalNumberPattern>[2-9]\d{8}</nationalNumberPattern>
<possibleNumberPattern>\d{9}</possibleNumberPattern>
<nationalNumberPattern>
[2-8]\d{8}|
9\d{8,11}
</nationalNumberPattern>
<possibleNumberPattern>\d{9,12}</possibleNumberPattern>
</generalDesc> </generalDesc>
<fixedLine> <fixedLine>
<nationalNumberPattern> <nationalNumberPattern>
@ -5192,7 +5208,7 @@
(?: (?:
60[1-8]| 60[1-8]|
7(?: 7(?:
0[25]|
0[2-5]|
[2379]\d [2379]\d
) )
)\d{6} )\d{6}
@ -5229,7 +5245,7 @@
<!-- Numbers belonging to private communication networks are included here. These are <!-- Numbers belonging to private communication networks are included here. These are
classified as Institutional networks, belonging to institutions like the police, armed classified as Institutional networks, belonging to institutions like the police, armed
forces and railways, along with a couple of formerly government-owned banks. These forces and railways, along with a couple of formerly government-owned banks. These
numbers are reachable by the public. -->
numbers are reachable by the public. -->
<nationalNumberPattern> <nationalNumberPattern>
9(?: 9(?:
5[056]| 5[056]|
@ -5238,6 +5254,32 @@
</nationalNumberPattern> </nationalNumberPattern>
<exampleNumber>972123456</exampleNumber> <exampleNumber>972123456</exampleNumber>
</uan> </uan>
<voicemail>
<nationalNumberPattern>
9(?:
3\d{9}|
6\d{7,10}
)
</nationalNumberPattern>
<possibleNumberPattern>\d{9,12}</possibleNumberPattern>
<exampleNumber>93123456789</exampleNumber>
</voicemail>
<shortCode>
<nationalNumberPattern>
1(?:
1(?:
6\d{3}|
8\d
)|
2\d{2,3}|
3\d{3,4}|
4\d{3}|
99
)
</nationalNumberPattern>
<possibleNumberPattern>\d{4,6}</possibleNumberPattern>
<exampleNumber>116123</exampleNumber>
</shortCode>
<emergency> <emergency>
<nationalNumberPattern> <nationalNumberPattern>
1(?: 1(?:
@ -6332,31 +6374,61 @@
<nationalNumberPattern>[5-9]\d{8}</nationalNumberPattern> <nationalNumberPattern>[5-9]\d{8}</nationalNumberPattern>
<possibleNumberPattern>\d{9}</possibleNumberPattern> <possibleNumberPattern>\d{9}</possibleNumberPattern>
</generalDesc> </generalDesc>
<!-- The pattern is complex because the Lleida Networks mobile ranges are inside the
fixed-line ranges. -->
<fixedLine> <fixedLine>
<nationalNumberPattern> <nationalNumberPattern>
(?:
8(?:
[13]0|
[28][0-8]|
[47][1-9]|
5[01346-9]|
6[0457-9]
8(?:
[13]0|
[28][0-8]|
[47][1-9]|
5[01346-9]|
6[0457-9]
)\d{6}|
9(?:
[1238][0-8]\d{6}|
4[1-9]\d{6}|
5\d{7}|
6(?:
[0-8]\d{6}|
9(?:
0(?:
[0-57-9]\d{4}|
6(?:
0[0-8]|
1[1-9]|
[2-9]\d
)\d{2}
)|
[1-9]\d{5}
)
)| )|
9(?:
[1238][0-8]|
[47][1-9]|
[56]\d
)
)\d{6}
7(?:
[124-9]\d{2}|
3(?:
[0-8]\d|
9[1-9]
)
)\d{4}
)
</nationalNumberPattern> </nationalNumberPattern>
<exampleNumber>810123456</exampleNumber> <exampleNumber>810123456</exampleNumber>
</fixedLine> </fixedLine>
<!-- The ranges 969060900 to 969061099 and 973900000 to 973909999 are mobile according to
information received from Lleida Networks. -->
<mobile> <mobile>
<nationalNumberPattern> <nationalNumberPattern>
(?: (?:
6\d|
7[1-4]
)\d{7}
6\d{6}|
7[1-4]\d{5}|
9(?:
6906(?:
09|
10
)|
7390\d{2}
)
)\d{2}
</nationalNumberPattern> </nationalNumberPattern>
<exampleNumber>612345678</exampleNumber> <exampleNumber>612345678</exampleNumber>
</mobile> </mobile>
@ -13585,21 +13657,16 @@
<leadingDigits>[1269]</leadingDigits> <leadingDigits>[1269]</leadingDigits>
<format>$1 $2</format> <format>$1 $2</format>
</numberFormat> </numberFormat>
<numberFormat pattern="(5[05]\d)(\d{5})">
<numberFormat pattern="(5[015]\d)(\d{5})">
<leadingDigits>5</leadingDigits> <leadingDigits>5</leadingDigits>
<format>$1 $2</format> <format>$1 $2</format>
</numberFormat> </numberFormat>
<numberFormat pattern="(65816)(\d{6})">
<leadingDigits>65816</leadingDigits>
<format>$1 $2</format>
</numberFormat>
</availableFormats> </availableFormats>
<generalDesc> <generalDesc>
<nationalNumberPattern> <nationalNumberPattern>
[12569]\d{6,7}|
65816\d{6}
[12569]\d{6,7}
</nationalNumberPattern> </nationalNumberPattern>
<possibleNumberPattern>\d{7,8}|\d{11}</possibleNumberPattern>
<possibleNumberPattern>\d{7,8}</possibleNumberPattern>
</generalDesc> </generalDesc>
<fixedLine> <fixedLine>
<nationalNumberPattern> <nationalNumberPattern>
@ -13607,7 +13674,10 @@
18\d| 18\d|
2(?: 2(?:
[23]\d{2}| [23]\d{2}|
4[1-35-9]\d|
4(?:
[1-35-9]\d|
44
)|
5(?: 5(?:
0[034]| 0[034]|
[2-46]\d| [2-46]\d|
@ -13625,17 +13695,12 @@
(?: (?:
5(?: 5(?:
0[0-2568]| 0[0-2568]|
11|
5\d 5\d
)| )|
6(?: 6(?:
0[034679]| 0[034679]|
5(?:
[015-79]|
8(?:
[02-9]|
1[0-57-9]
)
)|
5[015-9]|
6\d| 6\d|
7[067]| 7[067]|
9[069] 9[069]
@ -13652,12 +13717,6 @@
<exampleNumber>50012345</exampleNumber> <exampleNumber>50012345</exampleNumber>
</mobile> </mobile>
<!-- No tollFree or premiumRate information can be found. --> <!-- No tollFree or premiumRate information can be found. -->
<voicemail>
<!-- Wataniya Telecom -->
<nationalNumberPattern>65816\d{6}</nationalNumberPattern>
<possibleNumberPattern>\d{11}</possibleNumberPattern>
<exampleNumber>65816123456</exampleNumber>
</voicemail>
<shortCode> <shortCode>
<nationalNumberPattern> <nationalNumberPattern>
1(?: 1(?:
@ -24815,6 +24874,102 @@
</mobile> </mobile>
</territory> </territory>
<!-- BebbiCell (Formerly Global Networks Switzerland AG) +88234 -->
<!-- http://www.itu.int/oth/T0202000054/en -->
<!-- http://www.gsm.aq/numberplan.php -->
<!-- http://www.global.aq -->
<!-- Maritime Communications Partner (MCP) +88232 -->
<!-- http://www.itu.int/oth/T02020000F4/en -->
<!-- Oration Technologies +88237 -->
<!-- http://www.itu.int/oth/T02020000A0/en -->
<!-- Telespazio S.p.A. +88213 -->
<!-- http://www.itu.int/oth/T02020000CC/en -->
<!-- Thuraya +88216 -->
<!-- http://www.itu.int/oth/T02020000CF/en -->
<territory id="001" countryCode="882">
<availableFormats>
<numberFormat pattern="(\d{2})(\d{4})(\d{3})">
<leadingDigits>3[23]</leadingDigits>
<format>$1 $2 $3</format>
</numberFormat>
<numberFormat pattern="(\d{2})(\d{5})">
<leadingDigits>
16|
342
</leadingDigits>
<format>$1 $2</format>
</numberFormat>
<numberFormat pattern="(\d{2})(\d{4})(\d{4})">
<leadingDigits>34[57]</leadingDigits>
<format>$1 $2 $3</format>
</numberFormat>
<numberFormat pattern="(\d{3})(\d{4})(\d{4})">
<leadingDigits>348</leadingDigits>
<format>$1 $2 $3</format>
</numberFormat>
<numberFormat pattern="(\d{2})(\d{2})(\d{4})">
<leadingDigits>1</leadingDigits>
<format>$1 $2 $3</format>
</numberFormat>
<numberFormat pattern="(\d{2})(\d{3,4})(\d{4})">
<leadingDigits>16</leadingDigits>
<format>$1 $2 $3</format>
</numberFormat>
<numberFormat pattern="(\d{2})(\d{4,5})(\d{5})">
<leadingDigits>16</leadingDigits>
<format>$1 $2 $3</format>
</numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[13]\d{6,11}</nationalNumberPattern>
<possibleNumberPattern>\d{7,12}</possibleNumberPattern>
<exampleNumber>32123456</exampleNumber>
</generalDesc>
<fixedLine>
<nationalNumberPattern>NA</nationalNumberPattern>
<possibleNumberPattern>NA</possibleNumberPattern>
</fixedLine>
<mobile>
<!-- Bebbicell Mobile numbers, MCP & Oration. We are guessing the number length for
Oration based on numbers found online. -->
<nationalNumberPattern>
3(?:
2\d{3}|
37\d{2}|
4(?:
2|
7\d{3}
)
)\d{4}
</nationalNumberPattern>
<possibleNumberPattern>\d{7,10}</possibleNumberPattern>
</mobile>
<voip>
<!-- Telespazio S.p.A., Thuraya and Bebbicell VOIP numbers. -->
<nationalNumberPattern>
1(?:
3(?:
0[0347]|
[13][0139]|
2[035]|
4[013568]|
6[0459]|
7[06]|
8[15678]|
9[0689]
)\d{4}|
6\d{5,10}
)|
345\d{7}
</nationalNumberPattern>
<possibleNumberPattern>\d{7,12}</possibleNumberPattern>
</voip>
<voicemail>
<nationalNumberPattern>348[57]\d{7}</nationalNumberPattern>
<possibleNumberPattern>\d{11}</possibleNumberPattern>
</voicemail>
</territory>
<!-- http://www.itu.int/oth/T02020000F3/en --> <!-- http://www.itu.int/oth/T02020000F3/en -->
<!-- http://www.republicwireless.com/world-wi-fi-number --> <!-- http://www.republicwireless.com/world-wi-fi-number -->
<territory id="001" countryCode="883"> <territory id="001" countryCode="883">


+ 25
- 0
resources/PhoneNumberMetaDataForTesting.xml View File

@ -791,5 +791,30 @@
<nationalNumberPattern>\d{8}</nationalNumberPattern> <nationalNumberPattern>\d{8}</nationalNumberPattern>
</tollFree> </tollFree>
</territory> </territory>
<!-- Universal International Premium Rate Number -->
<territory id="001" countryCode="979">
<availableFormats>
<numberFormat pattern="(\d)(\d{4})(\d{4})">
<format>$1 $2 $3</format>
</numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>\d{9}</nationalNumberPattern>
<possibleNumberPattern>\d{9}</possibleNumberPattern>
<exampleNumber>123456789</exampleNumber>
</generalDesc>
<fixedLine>
<nationalNumberPattern>NA</nationalNumberPattern>
<possibleNumberPattern>NA</possibleNumberPattern>
</fixedLine>
<mobile>
<nationalNumberPattern>NA</nationalNumberPattern>
<possibleNumberPattern>NA</possibleNumberPattern>
</mobile>
<premiumRate>
<nationalNumberPattern>\d{9}</nationalNumberPattern>
</premiumRate>
</territory>
</territories> </territories>
</phoneNumberMetadata> </phoneNumberMetadata>

+ 2
- 2
resources/geocoding/en/221.txt View File

@ -15,5 +15,5 @@
# Generated from: # Generated from:
# http://en.wikipedia.org/wiki/+221 [373996724] # http://en.wikipedia.org/wiki/+221 [373996724]
2218|Dakar
2219|Outside Dakar
221338|Dakar
221339|Outside Dakar

+ 21
- 21
resources/geocoding/en/224.txt View File

@ -15,24 +15,24 @@
# Generated from: # Generated from:
# http://en.wikipedia.org/wiki/+224 [373997051] # http://en.wikipedia.org/wiki/+224 [373997051]
22424|Fria
22431|Boké
22432|Kamsar
22441|Conakry
22442|Sangoya
22443|Conakry
22445|Conakry
22446|Boussoura
22447|Conakry
22451|Labé
22453|Pita
22461|Kindia
224613|Télimélé
22468|Mamou
22469|Dalaba
22471|Kankan
22481|Faranah
22491|N'Zérékoré
22494|Macenta
22497|Guéckédou
22498|Kissidougou
2243024|Fria
2243031|Boké
2243032|Kamsar
2243041|Conakry
2243042|Conakry
2243043|Conakry
2243045|Conakry
2243046|Boussoura
2243047|Conakry
2243051|Labé
2243053|Pita
2243061|Kindia
22430613|Télimélé
2243068|Mamou
2243069|Dalaba
2243071|Kankan
2243081|Faranah
2243091|N'Zérékoré
2243094|Macenta
2243097|Guéckédou
2243098|Kissidougou

+ 33
- 27
resources/geocoding/en/226.txt View File

@ -13,31 +13,37 @@
# limitations under the License. # limitations under the License.
# Generated from: # Generated from:
# http://en.wikipedia.org/wiki/+226 [374115628]
# http://en.wikipedia.org/wiki/+226 [482669671] Except where overruled by
# http://www.onatel.bf/onatelsa/plandenumerotation_burkina.pdf
# Where there are many cities for a prefix, we only kept the more significant
# ones.
22630|Ouagadougou
22631|Ouagadougou
22632|Ouagadougou
22633|Ouagadougou
22634|Ouagadougou
22635|Ouagadougou
22636|Ouagadougou
22637|Ouagadougou
22638|Ouagadougou
22644|Koudougou
22645|Kaya
22649|Kaya
22652|Dédougou
22653|Tougan
22654|Tougan
22655|Ouahigouya
22656|Ouahigouya
22666|Dori
22670|Koupéla
22671|Tenkodogo
22677|Fada
22679|Kantchari
22686|Diébougou
22687|Gaoua
22688|Banfora
22696|Orodara
2262049|Kaya
2262052|Dédougou
2262053|Boromo/Djibasso/Nouna
2262090|Gaoua
2262091|Banfora
2262096|Orodara
2262097|Bobo-Dioulasso
2262098|Bobo-Dioulasso
2262099|Béréba/Fo/Houndé
2264045|Kaya
2264046|Falagountou/Dori
2264054|Yako
2264055|Ouahigouya
2264056|Djibo
2264070|Pouytenga/Koupéla
2264071|Tenkodogo
2264077|Fada/Diabo
2264079|Kantchari
226503|Ouagadougou
2265040|Pô/Kombissiri/Koubri
2265041|Léo/Sapouy
2265042|Ouagadougou
2265043|Ouagadougou
2265044|Koudougou
2265045|Ouagadougou
2265046|Ouagadougou
2265047|Ouagadougou
2265048|Ouagadougou
2265049|Ouagadougou

+ 7
- 7
resources/geocoding/en/242.txt View File

@ -14,10 +14,10 @@
# Translated from fr/242.txt using Freebase and Wikipedia. # Translated from fr/242.txt using Freebase and Wikipedia.
24221|Cuvette
24222|Likouala/Sangha
24223|Pool
24224|Plateaux
24225|Bouenza/Lekoumou/Niari
24228|Brazzaville
24229|Pointe-Noire
2422221|Cuvette
2422222|Likouala/Sangha
2422223|Pool
2422224|Plateaux
2422225|Bouenza/Lekoumou/Niari
2422228|Brazzaville
2422229|Pointe-Noire

+ 38
- 34
resources/geocoding/en/244.txt View File

@ -14,37 +14,41 @@
# Translated from pt/244.txt using Freebase and Wikipedia. # Translated from pt/244.txt using Freebase and Wikipedia.
24431|Cabinda
24432|Zaire
244321|Soyo
24433|Uige
24434|Bengo
244348|Caxito
24435|Cuanza Norte
244358|N'Dalatando
24436|Cuanza Sul
244363|Sumbe
244364|Porto Amboim
24441|Huambo
24448|Bie
244485|Kuito
24449|Cuando Cubango
24451|Malange
244526|Dundo
24453|Lunda Sul
244535|Saurimo
24454|Moxico
244546|Luena
24461|Huila
244612|Lubango
24464|Namibe
244643|Tombua
24465|Cunene
244652|St. Clara/Cunene
244655|Ondjiva
24472|Benguela
244722|Lobito
244726|Bela Vista
244728|Baia Farta
244729|Catumbela
244777|Dama Universal
24422|Luanda
244231|Cabinda
244232|Zaire
2442321|Soyo
244233|Uige
244234|Bengo
2442348|Caxito
244235|Cuanza Norte
2442358|N'Dalatando
244236|Cuanza Sul
2442363|Sumbe
2442364|Porto Amboim
244241|Huambo
244248|Bie
2442485|Kuito
244249|Cuando Cubango
2442498|Menongue
244251|Malange
244252|Lunda Norte
2442524|Lucapa
2442526|Dundo
244253|Lunda Sul
2442535|Saurimo
244254|Moxico
2442546|Luena
244261|Huila
2442612|Lubango
244264|Namibe
2442643|Tombua
244265|Cunene
2442652|Kuroka
2442655|Ondjiva
244272|Benguela
2442722|Lobito
2442726|Bela Vista
2442728|Baia Farta
2442729|Catumbela
2442777|Dama Universal

+ 20
- 19
resources/geocoding/en/245.txt View File

@ -14,22 +14,23 @@
# Translated from pt/245.txt using Freebase and Wikipedia. # Translated from pt/245.txt using Freebase and Wikipedia.
24522|S. Luzia
24525|Brá
24531|Mansoa/Manssabá
24532|Bigene/Bissorã
24533|Bula/Ingore
24535|Farim
24541|Bafatá/Bambadinca
24551|Gabú
24552|Sonaco
24553|Pirada
24561|Bedanda/Buba/Cacine/Catio/Fulacunda/Tite
24562|Quebo
24581|Bolama
24582|Bubaque
24583|Caravela
24584|Uno
24591|Canchungo
24592|Cacheu
24593|S. Domingos
245320|Bissau
245321|Bissau
245322|St. Luzia
245325|Brá
245331|Mansôa
245332|Bigene/Bissora
245334|Mansaba
245335|Farim
245341|Bafatá
245342|Bambadinca
245351|Gabu
245352|Sonaco
245353|Pirada
245354|Pitche
245370|Buba
245391|Canchungo
245392|Cacheu
245393|S. Domingos
245394|Bula
245396|Ingoré

+ 42
- 35
resources/geocoding/pt/244.txt View File

@ -13,40 +13,47 @@
# limitations under the License. # limitations under the License.
# Generated from: # Generated from:
# http://www.angolatelecom.com/AngolaTelecom/PT/telList/natIndicative/c (2011-07-22)
# http://www.angolatelecom.com/AngolaTelecom/PT/telList/natIndicative/c (2012-06-20)
# http://en.wikipedia.org/wiki/+244 [440874733] # http://en.wikipedia.org/wiki/+244 [440874733]
# Names were then checked on Portuguese wikipedia to find the most common
# Portuguese spelling: http://pt.wikipedia.org/wiki/Prov%C3%ADncias_de_Angola.
# St. Clara has apparently been renamed as Curoca.
24431|Cabinda
24432|Zaire
244321|Soyo
24433|Uige
24434|Bengo
244348|Caxito
24435|Kuanza Norte
244358|N'Dalatando
24436|Kuanza Sul
244363|Sumbe
244364|Porto Amboim
24441|Huambo
24448|Bie
244485|Kuito
24449|Kuando Kubango
24451|Malange
244526|Dundo
24453|Lunda Sul
244535|Saurimo
24454|Moxico
244546|Luena
24461|Huila
244612|Lubango
24464|Namibe
244643|Tombua
24465|Cunene
244652|St. Clara/Cunene
244655|Ondjiva
24472|Benguela
244722|Lobito
244726|Bela Vista
244728|Baia Farta
244729|Catumbela
244777|Dama Universal
24422|Luanda
244231|Cabinda
244232|Zaire
2442321|Soyo
244233|Uíge
244234|Bengo
2442348|Caxito
244235|Kwanza-Norte
2442358|N'Dalatando
244236|Kwanza-Sul
2442363|Sumbe
2442364|Porto Amboim
244241|Huambo
244248|Bié
2442485|Kuito
244249|Cuando-Cubango
2442498|Menongue
244251|Malanje
244252|Lunda-Norte
2442524|Lucapa
2442526|Dundo
244253|Lunda-Sul
2442535|Saurimo
244254|Moxico
2442546|Luena
244261|Huíla
2442612|Lubango
244264|Namibe
2442643|Tombua
244265|Cunene
2442652|Curoca
2442655|Ondjiva
244272|Benguela
2442722|Lobito
2442726|Bela Vista
2442728|Baía Farta
2442729|Catumbela
2442777|Dama Universal

+ 21
- 20
resources/geocoding/pt/245.txt View File

@ -13,24 +13,25 @@
# limitations under the License. # limitations under the License.
# Generated from: # Generated from:
# http://en.wikipedia.org/wiki/+245 [374256913]
# http://www.itu.int/oth/T020200005C/en
24522|S. Luzia
24525|Brá
24531|Mansoa/Manssabá
24532|Bigene/Bissorã
24533|Bula/Ingore
24535|Farim
24541|Bafatá/Bambadinca
24551|Gabú
24552|Sonaco
24553|Pirada
24561|Bedanda/Buba/Cacine/Catio/Fulacunda/Tite
24562|Quebo
24581|Bolama
24582|Bubaque
24583|Caravela
24584|Uno
24591|Canchungo
24592|Cacheu
24593|S. Domingos
245320|Bissau
245321|Bissau
245322|Sta. Luzia
245325|Brá
245331|Mansôa
245332|Bigene/Bissorã
245334|Mansaba
245335|Farim
245341|Bafatá
245342|Bambadinca
245351|Gabú
245352|Sonaco
245353|Pirada
245354|Pitche
245370|Buba
245391|Canchungo
245392|Cacheu
245393|S. Domingos
245394|Bula
245396|Ingoré

+ 5
- 1
resources/phonemetadata.proto View File

@ -138,7 +138,11 @@ message PhoneMetadata {
// nationally. // nationally.
required PhoneNumberDesc no_international_dialling = 24; required PhoneNumberDesc no_international_dialling = 24;
// The ISO 3166-1 alpha-2 representation of a country/region
// The ISO 3166-1 alpha-2 representation of a country/region, with the
// exception of "country calling codes" used for non-geographical entities,
// such as Universal International Toll Free Number (+800). These are all
// given the ID "001", since this is the numeric region code for the world
// according to UN M.49: http://en.wikipedia.org/wiki/UN_M.49
required string id = 9; required string id = 9;
// The country calling code that one would dial from overseas when trying to // The country calling code that one would dial from overseas when trying to


+ 5
- 4
tools/java/java-build/src/com/google/i18n/phonenumbers/BuildMetadataJsonFromXml.java View File

@ -117,6 +117,7 @@ public class BuildMetadataJsonFromXml extends Command {
writer.flush(); writer.flush();
writer.close(); writer.close();
formatter.close()
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
return false; return false;
@ -135,16 +136,16 @@ public class BuildMetadataJsonFromXml extends Command {
} else { } else {
writer.write(","); writer.write(",");
} }
String regionCode = metadata.getId();
String key = metadata.getId();
// For non-geographical country calling codes (e.g. +800), use the country calling codes // For non-geographical country calling codes (e.g. +800), use the country calling codes
// instead of the region code as key in the map. // instead of the region code as key in the map.
if (regionCode.equals("001")) {
regionCode = Integer.toString(metadata.getCountryCode());
if (key.equals("001")) {
key = Integer.toString(metadata.getCountryCode());
} }
JSArrayBuilder jsArrayBuilder = new JSArrayBuilder(); JSArrayBuilder jsArrayBuilder = new JSArrayBuilder();
toJsArray(metadata, jsArrayBuilder); toJsArray(metadata, jsArrayBuilder);
writer.write("\""); writer.write("\"");
writer.write(regionCode);
writer.write(key);
writer.write("\":"); writer.write("\":");
writer.write(jsArrayBuilder.toString()); writer.write(jsArrayBuilder.toString());
} }


Loading…
Cancel
Save