From 564a829c2e8b434478040c9a3894da4b58391483 Mon Sep 17 00:00:00 2001 From: Lara Scheidegger Date: Thu, 21 Jun 2012 16:37:38 +0000 Subject: [PATCH] JAVA: libphonenumber v4.9. Patch prepared by davinci. --- .../i18n/phonenumbers/geocoding/data/221_en | Bin 49 -> 49 bytes .../i18n/phonenumbers/geocoding/data/224_en | Bin 303 -> 303 bytes .../i18n/phonenumbers/geocoding/data/226_en | Bin 280 -> 471 bytes .../i18n/phonenumbers/geocoding/data/242_en | Bin 140 -> 140 bytes .../i18n/phonenumbers/geocoding/data/244_en | Bin 488 -> 537 bytes .../i18n/phonenumbers/geocoding/data/244_pt | Bin 95 -> 238 bytes .../i18n/phonenumbers/geocoding/data/245_en | Bin 325 -> 280 bytes .../i18n/phonenumbers/geocoding/data/245_pt | Bin 325 -> 67 bytes .../i18n/phonenumbers/geocoding/data/config | Bin 4943 -> 4943 bytes .../CountryCodeToRegionCodeMap.java | 8 +- .../i18n/phonenumbers/PhoneNumberUtil.java | 84 ++++-- .../data/PhoneNumberMetadataProto_882 | Bin 0 -> 764 bytes .../data/PhoneNumberMetadataProto_BF | Bin 429 -> 436 bytes .../data/PhoneNumberMetadataProto_CZ | Bin 536 -> 744 bytes .../data/PhoneNumberMetadataProto_ES | Bin 542 -> 708 bytes .../data/PhoneNumberMetadataProto_KW | Bin 617 -> 517 bytes .../CountryCodeToRegionCodeMapForTesting.java | 8 +- .../i18n/phonenumbers/ExampleNumbersTest.java | 5 +- .../phonenumbers/PhoneNumberUtilTest.java | 88 +++++-- .../PhoneNumberMetadataProtoForTesting_979 | Bin 0 -> 294 bytes java/release_notes.txt | 21 +- resources/PhoneNumberMetaData.xml | 243 ++++++++++++++---- resources/PhoneNumberMetaDataForTesting.xml | 25 ++ resources/geocoding/en/221.txt | 4 +- resources/geocoding/en/224.txt | 42 +-- resources/geocoding/en/226.txt | 60 +++-- resources/geocoding/en/242.txt | 14 +- resources/geocoding/en/244.txt | 72 +++--- resources/geocoding/en/245.txt | 39 +-- resources/geocoding/pt/244.txt | 77 +++--- resources/geocoding/pt/245.txt | 41 +-- resources/phonemetadata.proto | 6 +- .../BuildMetadataJsonFromXml.java | 9 +- 33 files changed, 580 insertions(+), 266 deletions(-) create mode 100644 java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_882 create mode 100644 java/libphonenumber/test/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_979 diff --git a/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/221_en b/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/221_en index b876d3015320ea193d3d44a240d6ebdaf472c28e..87a8cc14ef61beba7fed44a6bf63d0b0293bf610 100644 GIT binary patch literal 49 wcmZ4UmVvcgn*j)z7?=}gF|fKMW+xT_nX?&q{Yy)VGgDF(AVLfbj6hXv04ewj8UO$Q literal 49 vcmZ4UmVvcgn*j)z7#KKKF|fKMW+xT_nX4Ii{Yy)VGgDF(ph66cKvgUN7x4;$ diff --git a/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/224_en b/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/224_en index e63507da7877e9baa5cfc389b063fd0b30dc9bce..1a9cae3c5f1f8469e6c4c251f8841fda530846e0 100644 GIT binary patch literal 303 zcmZ4UmVvd3fq_wt0SH7Hlq@eWu(%avCIVU48Cae2vk$KXGH)=jc_-!;Cl&$O4;k2< z^Yaq3iz$WjCCR|;UV3piX7jta(T0T+fr^gA278H+OtO4WzO)rcW@9gk81{XtVnJE1tAINB8n%RFSPU;v&{Mxvgx<=90 Z-fOZcg`H}G;xdMru9#9kwi$|%Z2-LtTQ>jz diff --git a/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/226_en b/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/226_en index ed31886e028f9e96cd8123b1e2f30cb40104b751..41298f1500ef5f163d863d78e01ca0513975201f 100644 GIT binary patch literal 471 zcmXw#xlY4S5Jhhw3rQfXDJig^ME-}!3Wy*GOG7!vAsB)OIeA5>(*=p|utdopxS&Jq z%SVI~D7m(vm@_l?&GIzYBjhfC%v}aRmNxchdHMov0fm|bM;Zz$HFb5>@zr#s+f`I+ z8tR$a&WZ0Pg1x0C5X{%&D2yXl?7G_Pl)N}XE-6wJojCH;wAG+g7f)=*7s@kr=?KN3 zr^a?P^pRT=HG*P8g5Ke=P{}r=p9pIH29!7BNbNm2SJOvfJ5*2j$?~?5w*2p4a_n<3 zJLj5oy;jf`n={Vis3WL0;~QpYuHWtYp`SdsTvgm}1*ht1Tai7GQ{@>JG2XjH1=e5* zC2|=#a)sxz1{;_l8?3ShO-zwH$dJ1!_b?7?I7+&PpFF8G{K7o>jcM|SN4GBXm>~<8 oBd3rjr%{A;b&px{0h8oovi<5Q2mbit_!yR~* zTzt~Z?ELKSAEE~!m;?X@y)KSuf_SQKZM7oJs~Qa`AZSwb1@OWl~nW(T%Nc-Nte&48s-gsN;{W zWR0;DR8mEEw4p8S$k84n@rdO>k2sSfF6Bf|IG1O7!9ZS-$Qv%?9ie<+D4z)A3z2*S H@`Lmr;cQ4o diff --git a/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/242_en b/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/242_en index 86c316fa022f40f7356ba80189535656d260afee..2ad2a1a1f56696ef70576d37eb4cab0f1c300966 100644 GIT binary patch literal 140 zcmZ4UmVvdrjR6SQ8C1TWWngzMElVvaNdVkIf*5yiKP`l-a-a3r~J~?ysAWfpH!fx-275~zs$s^GZ^6{qi%5fFcZxK+FmNWHTuA diff --git a/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/244_en b/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/244_en index 59c00b9d2a29d47f3c2ba94757ce121071bce2d9..7234500ac04b0d5925c3be4e40250e4d3a1959bf 100644 GIT binary patch literal 537 zcmX|8OG?C05GF5E+nY{puC_<+tH`!n7a8_^k8zM*>d_hB@J z#vsX!$it5o<&>v%#e&`>aQlBJ@S{gK2PTWHG@jt} zY+)`Xe}=o8k1zB@z#9)RaW(oKtuA}=j`VdYy${Bu$=jyl7k{D|P$?$F_%@$Cq>Q}7 STu+kXno|D#H4eq$aJWA<)sLkB literal 488 zcmXX?Jxc>Y5Pf>?onHih!eJvev9$IsNWd6{QwtlJGl#6?ZuN2-l3<~zX;je8-d3>B z`Ct46HWs3tGbRfI@6EiKd9$ydPy=A<1N@eOBLgp_SZ6I_at3usI!_p$V`g8U2+E;? zBs(z-J6H@YWdrh?CNHE|V1AN`Y@2x>ZrxHEi~15ypha|riildq4{c22QP=Rcsm(+L zx0q{Kw&0J44B>8@o<5c#4^VZh+v4sKZj(|SOUD!3&}K;{_!+Ze&?c;MMueHj^bMm6 z)=*Cuf`?dWuGDy8AwD>92Nl_rXE~#LEbj6-#@}GyI)zgzs4e^7SXQBGY>ivWb$Aik zT&F?;sD@24-dNtiYfSEP$``nMCXKBWUa=GvRX=P~PHPjpPWc9JCu^PRu1LP%HcUKT z^^N&}Z}1Ovr;yqYbJFB*QvT0>F&9!HrsdH0Ra9z}lE0tnZjyJ1zaP^aio^W_*c^*~ diff --git a/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/244_pt b/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/244_pt index 34cf12b912ce9de370960e73d701db81f04d8400..0395f3eca537d52d903bd65b3fb895f248a4d6f4 100644 GIT binary patch literal 238 zcmZ4UmVveW1p^R>Ffi}pWMBk9^Mr^Lf+6BXPNi%JrK(jcvDK+FyRIJ!Ea literal 95 zcmZ4UmVvcAk^uYI$B@A3pk>JuCAit4;55!N&SMV-P eO3X{oXJFpd2Gq^Gs~b%AfQ({b0%BGmW&;4g(H58h diff --git a/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/245_en b/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/245_en index 2738fe8b720ece60f9315932fc50e132964c9967..377f1634bd6765a8e3556e112963163dee802edc 100644 GIT binary patch literal 280 zcmYk2L2ANK5QcwIUxmbr9vU1s}?3PCa*Lv@RDqDiMG-UbSb!W?I!2x z9h}jP0|Vdt=bxY99skj-fz|`K9??EOLupeKR58!*cmY2sN5hw@HpHVPI@&dVOaZ(l z*`hg#yuv`6B)0KbLUJeC`evX|9vgI@$eE1s4W6bQmDiMa^fYB5ZHx8U zg4|M+GaIN^<7g|658*OOW9FK#sjm57@F!%Ww6cjTd_zr$JreYTelQwN^UUz9U|}y? SpOWrpKL literal 325 zcmW+yu};G<6ub(Y26bqGA7Es{KfvUmA|#MNEi-vZOlv8zg%dOMZz@*4fHfNu6CfsL zU|@hR;2BGn@4dTsXTAGxh!rq61fN~t>JjPeVDB`n3~}{@P38MFqi0Oc$hMATd|E30 zyDu0kv(Q#cW!l#H{*I-u7^zT`Jh2PsH8ui}&W)!kN`A1fbVarzsX{?AqtbA2MxAkT%7JBw+}w0A^B3YG=z>jh zfke5Q8aBxj4CC-kU`;+mnvthlT}LX##-)w=F}5nQ!BJjPeVDB`n3~}{@P38MFqi0Oc$hMATd|E30 zyDu0kv(Q#cW!l#H{*I-u7^zT`Jh2PsH8ui}&W)!kN`A1fbVarzsX{?AqtbA2MxAkT%7JBw+}w0A^B3YG=z>jh zfke5Q8aBxj4CC-kU`;+mnvthlT}LX##-)w=F}5> 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. Map> countryCodeToRegionCodeMap = - new HashMap>(285); + new HashMap>(286); ArrayList listWithRegionCode; @@ -823,6 +823,10 @@ public class CountryCodeToRegionCodeMap { listWithRegionCode.add("001"); countryCodeToRegionCodeMap.put(881, listWithRegionCode); + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("001"); + countryCodeToRegionCodeMap.put(882, listWithRegionCode); + listWithRegionCode = new ArrayList(1); listWithRegionCode.add("001"); countryCodeToRegionCodeMap.put(883, listWithRegionCode); diff --git a/java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java b/java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java index b267face7..d984bbe52 100644 --- a/java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java +++ b/java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java @@ -59,7 +59,7 @@ public class PhoneNumberUtil { /** Flags to use when compiling regular expressions for phone numbers. */ static final int REGEX_FLAGS = Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE; // 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. static final int MAX_LENGTH_FOR_NSN = 16; // 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_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 // 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 diallableCharMap = new HashMap(); diallableCharMap.putAll(asciiDigitMappings); - diallableCharMap.put('+', '+'); + diallableCharMap.put(PLUS_SIGN, PLUS_SIGN); diallableCharMap.put('*', '*'); 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 // present. 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}"; // 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 - * 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. * 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. @@ -1342,7 +1341,9 @@ public class PhoneNumberUtil { // 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. 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 : rawInput; } @@ -2273,7 +2274,7 @@ public class PhoneNumberUtil { phoneNumber.setCountryCodeSource(countryCodeSource); } 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, "Phone number had an IDD, but after this was not " + "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}. * * @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 * 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 @@ -2614,24 +2616,8 @@ public class PhoneNumberUtil { "The string supplied was too long to parse."); } - int indexOfPhoneContext = numberToParse.indexOf(RFC3966_PHONE_CONTEXT); 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())) { throw new NumberParseException(NumberParseException.ErrorType.NOT_A_NUMBER, @@ -2725,6 +2711,50 @@ public class PhoneNumberUtil { 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. * diff --git a/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_882 b/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_882 new file mode 100644 index 0000000000000000000000000000000000000000..9befe4158349d0277e68f6eb39d13961c973fae0 GIT binary patch literal 764 zcmaJ;J5s|i5M3pckRn6J(5A>R@r(o>=nR_A}PZouL`hre>$9ICkPg#MEf>dU*A_PqKP>c0fp1 zq(O9D@!Bd{NLN(|{{-fhS=s3ll1`~ znq*@xZQ>9cwAU!xb>1^85d=fcwyO%1qG(QRZ+URea4x=0p-~eRJw@DGdBwj0md4gH z(fA#|;`rRr!wL&rS84G304Hg-2fB}Ubp-apdCJX=v1t%eAM+_gwAA9VjK1ja2FyeR(;cFyoH%_&07Z6Dh39|)e||(rM)%mt;~SfAlg9JJhsLRNEyY}SVS8b#%`P<$p`>j C;tjeO^Ko| z@FHV5@8=nR{m}A*sQ4x#r4(Hyvy1K9`#$!acRt4nNAYe2%3sOZA5v5oT~LgOA}uM@+p3)pM;y0%Nk27!H@`F_Utnhy%#ucFpx zAUHiiu4T~G&PU`5{+y&t@au@^O}_g)cs%+B7_Wm)nlox1FHE&0acIva6#h$CygVtw zCpYybr*#Qwkri!dh8E5}BpjOv#&AE2Akud}r{1#e>&dJTR_xew0ppV4!3HzZF1CO! zL9^)c0vE*pQywawU-2G3sn8k^Z>#;WRv>PS7g1 p3$4m$Sa+2m>ByNWtVe}S*$g6u_>p*9;W7S~x0Gc4$us*B{Q@++mqY*n delta 239 zcmaFCI)g=N&07Z6Dh387eg*~xMn*;ku4p4&%h;HdYKvM%238<#IZ@v*5zGJza2gpJ z8Jn1znOgvrs%Y3-nHfYI>RQCsm;>1c(MG1RHPJ@K<{$$!HG!JVV1|J7ni&{EbOZHr zSQr=}%TGM5!3weMw;Y5qS&I7COoQ4+(`BGBP@VwXTM1fC@+uAt`-O0X?wxf-YOlzL}l9 zE?-@L`>^iJ*y1_$EB>A~X51eyzCc>!Xs`*E-KRi)iq; gz()e|wsv;(luxpDmI;)^Qzl8=VF#+h+5K_iUv|k+djJ3c delta 113 zcmX@YI*)~O&07Z6Dh387(TSXLEO8q4RueUhgK8{+jA%n6V~f~m16_;QnrIXA*l0st zOCZbCEH)-ZQ!^%|+N_q5ffYzw0%=YQLj$0C6H_xrMh0P^ZnKz_8grl)lUR^a^UYz5 Gd5i#wrX1e@ diff --git a/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW b/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW index f1f6ed8437de8be7f0cf7c4c473ab00b2d36f157..27a156e5bbd99832778f3546687aa1130aa5ad00 100644 GIT binary patch delta 159 zcmaFK(#oQ@<}Cwj6$1m~9|j=7$jHDKZD?d_W*HlkQf;PVUdzb94rH0@SkwY#8G sw#GEtz!0Q!;_F3|V;OlSZ(=lNWSabpQI}0n10*+Df=P)D=oBCT07hjd$p8QV delta 265 zcmZo=dCB6i<}Cwj6$1lP0s{jBBO@b&WVE4?shMSLOiHzxj(Kg3nW=@L8HiKM$iN4r z&2=nlYk;(&VJ%QSgZD%|ajs}XU1L*Ske-QQP9F6d_Ex4qY!Gdr3pC0iw#GCjMYF~X zB4li0W^M@-0`j5_3{7=G91AeV2xvl$AyAX4Igq8PIq}3IB`##^*&x<3GH`=M4ULRV zOwA@2Gnz3nPhQ2S%POE@8f`H7E~An@p9WZkrUuyInhdNeh6*Z1ARjWYf@K&%OgI1l Da4S5e diff --git a/java/libphonenumber/test/com/google/i18n/phonenumbers/CountryCodeToRegionCodeMapForTesting.java b/java/libphonenumber/test/com/google/i18n/phonenumbers/CountryCodeToRegionCodeMapForTesting.java index 8b78fe920..b93b3bef1 100644 --- a/java/libphonenumber/test/com/google/i18n/phonenumbers/CountryCodeToRegionCodeMapForTesting.java +++ b/java/libphonenumber/test/com/google/i18n/phonenumbers/CountryCodeToRegionCodeMapForTesting.java @@ -31,10 +31,10 @@ public class CountryCodeToRegionCodeMapForTesting { // countries sharing a calling code, such as the NANPA countries, the one // indicated with "isMainCountryForCode" in the metadata should be first. static Map> 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. Map> countryCodeToRegionCodeMap = - new HashMap>(22); + new HashMap>(24); ArrayList listWithRegionCode; @@ -108,6 +108,10 @@ public class CountryCodeToRegionCodeMapForTesting { listWithRegionCode.add("001"); countryCodeToRegionCodeMap.put(800, listWithRegionCode); + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("001"); + countryCodeToRegionCodeMap.put(979, listWithRegionCode); + return countryCodeToRegionCodeMap; } } diff --git a/java/libphonenumber/test/com/google/i18n/phonenumbers/ExampleNumbersTest.java b/java/libphonenumber/test/com/google/i18n/phonenumbers/ExampleNumbersTest.java index 1d23fc2b3..4d7b899a8 100644 --- a/java/libphonenumber/test/com/google/i18n/phonenumbers/ExampleNumbersTest.java +++ b/java/libphonenumber/test/com/google/i18n/phonenumbers/ExampleNumbersTest.java @@ -176,9 +176,8 @@ public class ExampleNumbersTest extends TestCase { assertEquals(0, wrongTypeCases.size()); } - // TODO: Update this to use connectsToEmergencyNumber or similar once that is - // implemented. public void testEmergency() throws Exception { + ShortNumberUtil shortUtil = new ShortNumberUtil(phoneNumberUtil); int wrongTypeCounter = 0; for (String regionCode : phoneNumberUtil.getSupportedRegions()) { PhoneNumberDesc desc = @@ -186,7 +185,7 @@ public class ExampleNumbersTest extends TestCase { if (desc.hasExampleNumber()) { String exampleNumber = desc.getExampleNumber(); if (!exampleNumber.matches(desc.getPossibleNumberPattern()) || - !exampleNumber.matches(desc.getNationalNumberPattern())) { + !shortUtil.isEmergencyNumber(exampleNumber, regionCode)) { wrongTypeCounter++; LOGGER.log(Level.SEVERE, "Emergency example number test failed for " + regionCode); } diff --git a/java/libphonenumber/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java b/java/libphonenumber/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java index 77e1c49fc..2b7f0a302 100644 --- a/java/libphonenumber/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java +++ b/java/libphonenumber/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java @@ -99,8 +99,13 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { .setRawInput("000-000-0000"); private static final PhoneNumber INTERNATIONAL_TOLL_FREE = 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 = - 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() { assertTrue(phoneUtil.getSupportedRegions().size() > 0); @@ -286,6 +291,7 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { public void testGetExampleNumberForNonGeoEntity() { assertEquals(INTERNATIONAL_TOLL_FREE, phoneUtil.getExampleNumberForNonGeoEntity(800)); + assertEquals(UNIVERSAL_PREMIUM_RATE, phoneUtil.getExampleNumberForNonGeoEntity(979)); } public void testConvertAlphaCharactersInNumber() { @@ -296,7 +302,7 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { } public void testNormaliseRemovePunctuation() { - String inputNumber = "034-56&+#234"; + String inputNumber = "034-56&+#2\u00AD34"; String expectedOutput = "03456234"; assertEquals("Conversion did not correctly remove punctuation", expectedOutput, @@ -868,6 +874,12 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { phoneUtil.parseAndKeepRawInput("0011 16502530000", RegionCode.AU); assertEquals("0011 1 650 253 0000", 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() { @@ -892,6 +904,9 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { premiumRateNumber.setCountryCode(49).setNationalNumber(90091234567L); assertEquals(PhoneNumberUtil.PhoneNumberType.PREMIUM_RATE, phoneUtil.getNumberType(premiumRateNumber)); + + assertEquals(PhoneNumberUtil.PhoneNumberType.PREMIUM_RATE, + phoneUtil.getNumberType(UNIVERSAL_PREMIUM_RATE)); } public void testIsTollFree() { @@ -977,6 +992,7 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { assertTrue(phoneUtil.isValidNumber(IT_NUMBER)); assertTrue(phoneUtil.isValidNumber(GB_MOBILE)); assertTrue(phoneUtil.isValidNumber(INTERNATIONAL_TOLL_FREE)); + assertTrue(phoneUtil.isValidNumber(UNIVERSAL_PREMIUM_RATE)); PhoneNumber nzNumber = new PhoneNumber().setCountryCode(64).setNationalNumber(21387835L); assertTrue(phoneUtil.isValidNumber(nzNumber)); @@ -1061,6 +1077,7 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { assertEquals(RegionCode.GB, phoneUtil.getRegionCodeForCountryCode(44)); assertEquals(RegionCode.DE, phoneUtil.getRegionCodeForCountryCode(49)); assertEquals(RegionCode.UN001, phoneUtil.getRegionCodeForCountryCode(800)); + assertEquals(RegionCode.UN001, phoneUtil.getRegionCodeForCountryCode(979)); } public void testGetRegionCodeForNumber() { @@ -1068,6 +1085,7 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { assertEquals(RegionCode.US, phoneUtil.getRegionCodeForNumber(US_NUMBER)); assertEquals(RegionCode.GB, phoneUtil.getRegionCodeForNumber(GB_MOBILE)); assertEquals(RegionCode.UN001, phoneUtil.getRegionCodeForNumber(INTERNATIONAL_TOLL_FREE)); + assertEquals(RegionCode.UN001, phoneUtil.getRegionCodeForNumber(UNIVERSAL_PREMIUM_RATE)); } public void testGetCountryCodeForRegion() { @@ -1158,7 +1176,7 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { adNumber.setCountryCode(376).setNationalNumber(12345L); assertEquals(PhoneNumberUtil.ValidationResult.IS_POSSIBLE, phoneUtil.isPossibleNumberWithReason(adNumber)); - adNumber.setCountryCode(376).setNationalNumber(13L); + adNumber.setCountryCode(376).setNationalNumber(1L); assertEquals(PhoneNumberUtil.ValidationResult.TOO_SHORT, phoneUtil.isPossibleNumberWithReason(adNumber)); 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:331-6005;phone-context=+64-3", RegionCode.NZ)); 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. // Should strip country calling code. 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("+ 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(); nzNumber.setCountryCode(64).setNationalNumber(64123456L); assertEquals(nzNumber, phoneUtil.parse("64(0)64123456", RegionCode.NZ)); @@ -1633,6 +1669,8 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { public void testParseNonAscii() throws Exception { // Using a full-width plus sign. 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. assertEquals(US_NUMBER, phoneUtil.parse("\uFF0B\uFF11\u3000\uFF08\uFF16\uFF15\uFF10\uFF09" + "\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."); } 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) { // Expected this exception. assertEquals("Wrong error type stored in exception.", - NumberParseException.ErrorType.NOT_A_NUMBER, + NumberParseException.ErrorType.INVALID_COUNTRY_CODE, e.getErrorType()); - } catch (NullPointerException e) { - fail("Domain provided for phone context - but should not throw a null pointer exception."); } try { // This is invalid because no "+" sign is present as part of phone-context. This should not // 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) { // Expected this exception. assertEquals("Wrong error type stored in exception.", - NumberParseException.ErrorType.NOT_A_NUMBER, + NumberParseException.ErrorType.INVALID_COUNTRY_CODE, 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("+64 3 331 6005", 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. 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 // ParseAndKeepRawInput and no carrier code was found. @@ -2112,6 +2148,8 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { phoneUtil.isNumberMatch("+643 331-6005", "+6433316005")); assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH, 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. assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH, phoneUtil.isNumberMatch("+1800 siX-Flags", "+1 800 7493 5247")); @@ -2162,6 +2200,9 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { // Extension different, all else the same. assertEquals(PhoneNumberUtil.MatchType.NO_MATCH, 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. assertEquals(PhoneNumberUtil.MatchType.NO_MATCH, phoneUtil.isNumberMatch("+64 3 331-6005 ext.1235", "3 331 6005#1234")); @@ -2181,6 +2222,9 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { // NSN matches. assertEquals(PhoneNumberUtil.MatchType.NSN_MATCH, 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, phoneUtil.isNumberMatch(NZ_NUMBER, "03 331 6005")); // 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. assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH, 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, // so this is considered a SHORT_NSN_MATCH. assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH, phoneUtil.isNumberMatch("3 331-6005", "03 331 6005")); assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH, 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, phoneUtil.isNumberMatch("3 331-6005", "+64 331 6005")); // Short NSN match with the country specified. diff --git a/java/libphonenumber/test/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_979 b/java/libphonenumber/test/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_979 new file mode 100644 index 0000000000000000000000000000000000000000..0c143ce55bc93b690d430f025200a8207c57e279 GIT binary patch literal 294 zcmZ4UmVvd3fq_w$0Z1@1GO)&^R9n^}Xih^TV-r&|a|=tLB$J;blpsYIXfAQaf)v86 xpc8$26jY3%%0Mci003-cCY}HQ literal 0 HcmV?d00001 diff --git a/java/release_notes.txt b/java/release_notes.txt index 31587782e..f7aae0577 100644 --- a/java/release_notes.txt +++ b/java/release_notes.txt @@ -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 * Metadata update only: - 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: - AE, RO - Non-geographical entity with calling code 881 (Iridium) diff --git a/resources/PhoneNumberMetaData.xml b/resources/PhoneNumberMetaData.xml index 0d7e5bbd2..ead5b43a4 100644 --- a/resources/PhoneNumberMetaData.xml +++ b/resources/PhoneNumberMetaData.xml @@ -2433,8 +2433,9 @@ (?: 6(?: - 0[0-5]| - [68]0 + 0[0-7]| + 6[0-2]| + 8[01] )| 7(?: [02-68]\d| @@ -5169,12 +5170,27 @@ + + [2-8]| + 9[015-7] + $1 $2 $3 + + 96 + $1 $2 $3 $4 + + + 9[36] + $1 $2 $3 $4 + - [2-9]\d{8} - \d{9} + + [2-8]\d{8}| + 9\d{8,11} + + \d{9,12} @@ -5192,7 +5208,7 @@ (?: 60[1-8]| 7(?: - 0[25]| + 0[2-5]| [2379]\d ) )\d{6} @@ -5229,7 +5245,7 @@ + numbers are reachable by the public. --> 9(?: 5[056]| @@ -5238,6 +5254,32 @@ 972123456 + + + 9(?: + 3\d{9}| + 6\d{7,10} + ) + + \d{9,12} + 93123456789 + + + + 1(?: + 1(?: + 6\d{3}| + 8\d + )| + 2\d{2,3}| + 3\d{3,4}| + 4\d{3}| + 99 + ) + + \d{4,6} + 116123 + 1(?: @@ -6332,31 +6374,61 @@ [5-9]\d{8} \d{9} + - (?: - 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} + ) 810123456 + (?: - 6\d| - 7[1-4] - )\d{7} + 6\d{6}| + 7[1-4]\d{5}| + 9(?: + 6906(?: + 09| + 10 + )| + 7390\d{2} + ) + )\d{2} 612345678 @@ -13585,21 +13657,16 @@ [1269] $1 $2 - + 5 $1 $2 - - 65816 - $1 $2 - - [12569]\d{6,7}| - 65816\d{6} + [12569]\d{6,7} - \d{7,8}|\d{11} + \d{7,8} @@ -13607,7 +13674,10 @@ 18\d| 2(?: [23]\d{2}| - 4[1-35-9]\d| + 4(?: + [1-35-9]\d| + 44 + )| 5(?: 0[034]| [2-46]\d| @@ -13625,17 +13695,12 @@ (?: 5(?: 0[0-2568]| + 11| 5\d )| 6(?: 0[034679]| - 5(?: - [015-79]| - 8(?: - [02-9]| - 1[0-57-9] - ) - )| + 5[015-9]| 6\d| 7[067]| 9[069] @@ -13652,12 +13717,6 @@ 50012345 - - - 65816\d{6} - \d{11} - 65816123456 - 1(?: @@ -24815,6 +24874,102 @@ + + + + + + + + + + + + + + + + 3[23] + $1 $2 $3 + + + + 16| + 342 + + $1 $2 + + + 34[57] + $1 $2 $3 + + + 348 + $1 $2 $3 + + + 1 + $1 $2 $3 + + + 16 + $1 $2 $3 + + + 16 + $1 $2 $3 + + + + [13]\d{6,11} + \d{7,12} + 32123456 + + + NA + NA + + + + + 3(?: + 2\d{3}| + 37\d{2}| + 4(?: + 2| + 7\d{3} + ) + )\d{4} + + \d{7,10} + + + + + 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} + + \d{7,12} + + + 348[57]\d{7} + \d{11} + + + diff --git a/resources/PhoneNumberMetaDataForTesting.xml b/resources/PhoneNumberMetaDataForTesting.xml index a18e41f56..588a2d73d 100644 --- a/resources/PhoneNumberMetaDataForTesting.xml +++ b/resources/PhoneNumberMetaDataForTesting.xml @@ -791,5 +791,30 @@ \d{8} + + + + + + $1 $2 $3 + + + + \d{9} + \d{9} + 123456789 + + + NA + NA + + + NA + NA + + + \d{9} + + diff --git a/resources/geocoding/en/221.txt b/resources/geocoding/en/221.txt index be6e6d5c3..70a6dcb71 100644 --- a/resources/geocoding/en/221.txt +++ b/resources/geocoding/en/221.txt @@ -15,5 +15,5 @@ # Generated from: # http://en.wikipedia.org/wiki/+221 [373996724] -2218|Dakar -2219|Outside Dakar +221338|Dakar +221339|Outside Dakar diff --git a/resources/geocoding/en/224.txt b/resources/geocoding/en/224.txt index 947660db3..4b1d94580 100644 --- a/resources/geocoding/en/224.txt +++ b/resources/geocoding/en/224.txt @@ -15,24 +15,24 @@ # Generated from: # 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 diff --git a/resources/geocoding/en/226.txt b/resources/geocoding/en/226.txt index 92ec48ce6..f8e08c3c7 100644 --- a/resources/geocoding/en/226.txt +++ b/resources/geocoding/en/226.txt @@ -13,31 +13,37 @@ # limitations under the License. # 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 diff --git a/resources/geocoding/en/242.txt b/resources/geocoding/en/242.txt index 3429119ac..47160dcb1 100644 --- a/resources/geocoding/en/242.txt +++ b/resources/geocoding/en/242.txt @@ -14,10 +14,10 @@ # 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 diff --git a/resources/geocoding/en/244.txt b/resources/geocoding/en/244.txt index 5ab2f8e25..68f9993f4 100644 --- a/resources/geocoding/en/244.txt +++ b/resources/geocoding/en/244.txt @@ -14,37 +14,41 @@ # 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 diff --git a/resources/geocoding/en/245.txt b/resources/geocoding/en/245.txt index 40b606472..48b442362 100644 --- a/resources/geocoding/en/245.txt +++ b/resources/geocoding/en/245.txt @@ -14,22 +14,23 @@ # 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é diff --git a/resources/geocoding/pt/244.txt b/resources/geocoding/pt/244.txt index b6a252412..7c8e730b7 100644 --- a/resources/geocoding/pt/244.txt +++ b/resources/geocoding/pt/244.txt @@ -13,40 +13,47 @@ # limitations under the License. # 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] +# 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 diff --git a/resources/geocoding/pt/245.txt b/resources/geocoding/pt/245.txt index fa9ebed11..61e7955bc 100644 --- a/resources/geocoding/pt/245.txt +++ b/resources/geocoding/pt/245.txt @@ -13,24 +13,25 @@ # limitations under the License. # 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é diff --git a/resources/phonemetadata.proto b/resources/phonemetadata.proto index f11334424..ecd3ba287 100644 --- a/resources/phonemetadata.proto +++ b/resources/phonemetadata.proto @@ -138,7 +138,11 @@ message PhoneMetadata { // nationally. 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; // The country calling code that one would dial from overseas when trying to diff --git a/tools/java/java-build/src/com/google/i18n/phonenumbers/BuildMetadataJsonFromXml.java b/tools/java/java-build/src/com/google/i18n/phonenumbers/BuildMetadataJsonFromXml.java index 76e281492..6b45506c2 100644 --- a/tools/java/java-build/src/com/google/i18n/phonenumbers/BuildMetadataJsonFromXml.java +++ b/tools/java/java-build/src/com/google/i18n/phonenumbers/BuildMetadataJsonFromXml.java @@ -117,6 +117,7 @@ public class BuildMetadataJsonFromXml extends Command { writer.flush(); writer.close(); + formatter.close() } catch (Exception e) { e.printStackTrace(); return false; @@ -135,16 +136,16 @@ public class BuildMetadataJsonFromXml extends Command { } else { writer.write(","); } - String regionCode = metadata.getId(); + String key = metadata.getId(); // For non-geographical country calling codes (e.g. +800), use the country calling codes // 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(); toJsArray(metadata, jsArrayBuilder); writer.write("\""); - writer.write(regionCode); + writer.write(key); writer.write("\":"); writer.write(jsArrayBuilder.toString()); }