google/libphonenumber

GitHub: google/libphonenumber

Google开发的多语言电话号码处理库,提供全球电话号码的解析、验证、格式化及地理编码等功能。

Stars: 18001 | Forks: 2154

# 它是什么? Google 的通用 Java、C++ 和 JavaScript 库,用于解析、格式化和验证国际电话号码。Java 版本经过优化,适用于智能手机,并自 Android 4.0(Ice Cream Sandwich)起被 Android 框架使用。 # 快速链接 * **想要报告问题?** 想要发送 pull request?请参阅[贡献指南](CONTRIBUTING.md) * 查看[常见问题](FAQ.md) * 有趣![程序员关于电话号码的错误认知](FALSEHOODS.md) * 在与您感兴趣的代码相关的目录中查找 [`README`](https://github.com/google/libphonenumber/find/master)。 * 面向贡献者和移植者:[如何运行 Java demo](run-java-demo.md) * 面向移植者:[如何进行元数据更改](making-metadata-changes.md) # 功能亮点 * 解析、格式化和验证世界上所有国家/地区的电话号码。 * `getNumberType` - 根据号码本身获取号码类型;能够区分固定电话、移动电话、免费电话、Premium Rate、Shared Cost、VoIP、个人号码、UAN、寻呼机和语音邮件(只要可行)。 * `isNumberMatch` - 获取关于两个号码是否可能相同的置信度。 * `getExampleNumber` 和 `getExampleNumberForType` - 为所有国家/地区提供有效的示例号码,并可选择指定所需示例电话号码的类型。 * `isPossibleNumber` - 仅使用长度信息快速猜测号码是否可能是电话号码,比完整验证快得多。 * `isValidNumber` - 使用长度和前缀信息对某个区域的电话号码进行完整验证。 * `AsYouTypeFormatter` - 在用户输入每位数字时即时格式化电话号码。 * `findNumbers` - 在文本中查找号码。 * `PhoneNumberOfflineGeocoder` - 提供与电话号码相关的地理信息。 * `PhoneNumberToCarrierMapper` - 提供与电话号码相关的运营商信息。 * `PhoneNumberToTimeZonesMapper` - 提供与电话号码相关的时区信息。 # Demo ## Java [Java demo](https://libphonenumber.appspot.com/) 会在 GitHub 发布后稍有延迟地进行更新。 上次 demo 更新:v9.0.30。 注意:尽管库(主分支/[maven release](https://repo1.maven.org/maven2/com/googlecode/libphonenumber/libphonenumber/8.12.56/))的版本为 v8.12.57,但由于一些部署问题,我们无法使用新的二进制版本更新 Java demo。我们将很快解决此问题。同时,请使用 JS demo。 如果此数字低于[最新发布版本的版本号](https://github.com/google/libphonenumber/releases),说明我们正处于两次发布之间,demo 可能是其中任何一个版本。 ### Demo App 此存储库中有一个名为 [E.164 Formatter](java/demoapp) 的 Android Demo App。此 App 的目的是展示如何在真实场景中使用该库的示例,特别是针对使用 Java 的 Android App。 ## JavaScript [JavaScript demo](https://htmlpreview.github.io/?https://github.com/google/libphonenumber/blob/master/javascript/i18n/phonenumbers/demo-compiled.html) 可以在各种标签下运行;此链接会将您带到 `master` 分支。 # Java 代码 要在您的应用程序中包含 Java 代码,可以通过 Maven 进行集成(参见 [wiki](https://github.com/google/libphonenumber/wiki))或从 [Maven repository](https://repo1.maven.org/maven2/com/googlecode/libphonenumber/libphonenumber/) 下载最新的 jar 包。 # Javadoc Javadoc 会自动更新以反映最新版本,网址为 https://javadoc.io/doc/com.googlecode.libphonenumber/libphonenumber/。 # 版本控制与公告 我们通常遵循以下指南来选择发布版本号。 如果自上次发布以来推送到 master 的任何更改与现有 libphonenumber API 的意图/规范不兼容,或者可能导致 libphonenumber(Java、C++ 或 JS)客户端不得不更改其代码以保持构建成功,我们将发布一个主要版本。例如,如果上次发布是 7.7.3,新版本将是 8.0.0。 如果这些更改中的任何一个*使*客户端能够更新其代码以利用新功能,并且如果客户端在发布被标记为“bad”时必须回滚这些更改,我们将发布一个次要版本。例如,我们将从 7.7.3 更新到 7.8.0。 否则,包括发布仅包含[元数据](FAQ.md#metadata_definition)更改的情况,我们将发布一个修订版本,例如从 7.7.3 到 7.7.4。 有时我们会更改代码或元数据的内部结构,虽然不影响客户端的兼容性,但可能会影响该库**移植者**的兼容性。对于此类更改,我们会在 [libphonenumber-discuss]( https://groups.google.com/forum/#!forum/libphonenumber-discuss) 上发布公告。这些更改不会反映在版本号中,如果没有其他更改,我们将发布一个修订版本。 想要收到新版本发布的通知吗?在一年的大部分时间里,除假期和特殊情况外,我们每两周发布一次。我们会更新[发布标签](https://github.com/google/libphonenumber/releases)并记录详细的[发布说明]( https://github.com/google/libphonenumber/blob/master/release_notes.txt)。 我们还会在每次发布时向 [libphonenumber-discuss]( https://groups.google.com/forum/#!forum/libphonenumber-discuss) 发送公告。 # 快速示例 假设您有一个代表瑞士电话号码的字符串。您可以这样将其解析/规范化为 `PhoneNumber` 对象: ``` String swissNumberStr = "044 668 18 00"; PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(); try { PhoneNumber swissNumberProto = phoneUtil.parse(swissNumberStr, "CH"); } catch (NumberParseException e) { System.err.println("NumberParseException was thrown: " + e.toString()); } ``` 此时,`swissNumberProto` 包含: ``` { "country_code": 41, "national_number": 446681800 } ``` `PhoneNumber` 是一个最初由 `phonenumber.proto` 自动生成并为了提高效率进行了必要修改的类。有关每个字段含义的详细信息,请参阅 `resources/phonenumber.proto`。 现在让我们验证该号码是否有效: ``` boolean isValid = phoneUtil.isValidNumber(swissNumberProto); // returns true ``` 格式化方法支持多种格式,如下所示: ``` // Produces "+41 44 668 18 00" System.out.println(phoneUtil.format(swissNumberProto, PhoneNumberFormat.INTERNATIONAL)); // Produces "044 668 18 00" System.out.println(phoneUtil.format(swissNumberProto, PhoneNumberFormat.NATIONAL)); // Produces "+41446681800" System.out.println(phoneUtil.format(swissNumberProto, PhoneNumberFormat.E164)); ``` 您还可以选择以从其他国家/地区拨号的方式来格式化该号码: ``` // Produces "011 41 44 668 1800", the number when it is dialed in the United States. System.out.println(phoneUtil.formatOutOfCountryCallingNumber(swissNumberProto, "US")); ``` ## “输入时”格式化电话号码 ``` PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(); AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("US"); System.out.println(formatter.inputDigit('6')); // Outputs "6" ... // Input more digits System.out.println(formatter.inputDigit('3')); // Now outputs "650 253" ``` ## 电话号码地理编码 ``` PhoneNumberOfflineGeocoder geocoder = PhoneNumberOfflineGeocoder.getInstance(); // Outputs "Zurich" System.out.println(geocoder.getDescriptionForNumber(swissNumberProto, Locale.ENGLISH)); // Outputs "Zürich" System.out.println(geocoder.getDescriptionForNumber(swissNumberProto, Locale.GERMAN)); // Outputs "Zurigo" System.out.println(geocoder.getDescriptionForNumber(swissNumberProto, Locale.ITALIAN)); ``` ## 将电话号码映射到原始运营商 注意事项:我们不提供有关电话号码当前运营商的数据,仅提供分配了相应号段的原始运营商。请阅读关于[号码可携性](FAQ.md#what-is-mobile-number-portability)的内容。 ``` PhoneNumber swissMobileNumber = new PhoneNumber().setCountryCode(41).setNationalNumber(798765432L); PhoneNumberToCarrierMapper carrierMapper = PhoneNumberToCarrierMapper.getInstance(); // Outputs "Swisscom" System.out.println(carrierMapper.getNameForNumber(swissMobileNumber, Locale.ENGLISH)); ``` 关于如何使用该库的更多示例可以在[单元测试](https://github.com/google/libphonenumber/tree/master/java/libphonenumber/test/com/google/i18n/phonenumbers)中找到。 # 第三方移植 我们知道有几个第三方电话号码库移植版本。我们在此分享它们,以便对开发者有所帮助。 但是,我们强调这些移植版本是由 libphonenumber 项目之外的开发者提供的。我们不评估它们的质量,也不影响它们的维护过程。 * C#: https://github.com/twcclegg/libphonenumber-csharp * Gleam: https://github.com/massivefermion/phony * Go: https://github.com/nyaruka/phonenumbers * Objective-c: https://github.com/iziz/libPhoneNumber-iOS * Swift: https://github.com/marmelroy/PhoneNumberKit * PHP: https://github.com/giggsey/libphonenumber-for-php * PostgreSQL in-database types: https://github.com/blm768/pg-libphonenumber * Python: https://github.com/daviddrysdale/python-phonenumbers * Ruby: https://github.com/ianks/mini_phone * Ruby: https://github.com/daddyz/phonelib * Ruby: https://github.com/mobi/telephone_number * Rust: https://github.com/vloldik/rlibphonenumber * Rust: https://github.com/1aim/rust-phonenumber * Erlang: https://github.com/marinakr/libphonenumber_erlang * Clojure: https://github.com/randomseed-io/phone-number * R: https://github.com/socialresearchcentre/dialr/ * Elixir: https://github.com/socialpaymentsbv/ex_phone_number * Salesforce: https://appexchange.salesforce.com/appxListingDetail?listingId=a0N3A00000G12oJUAR * Dart: https://github.com/superakabo/dlibphonenumber 我们自有版本的替代方案: * 针对 Android 优化:我们的 Java 版本从 `Class#getResourcesAsStream` 加载元数据,并要求 Android 应用遵循 Android 加载最佳实践,自行重新打包元数据并从 `AssetManager#open()` 加载 ([常见问题解答](https://github.com/google/libphonenumber/blob/master/FAQ.md#optimize-loads))。 如果您不想这样做,可以查看位于 https://github.com/MichaelRocks/libphonenumber-android 的移植版本,它确实重新打包了元数据并使用了 `AssetManager#open()`,并且无需客户端进行那些特定的加载优化即可依赖。您还应该查看位于 https://github.com/lionscribe/libphonenumber-android 的移植版本,它也支持地理编码,并且只需更改一行代码。 * Javascript:如果您不想使用我们依赖 Closure 的版本,还有其他几个选项,包括 https://github.com/catamphetamine/libphonenumber-js - 一个精简的重写版本,大小约为 110 KB - 以及 https://github.com/seegno/google-libphonenumber - 一个与 browserify 兼容的封装,围绕可通过 npm 安装的原始未修改库,打包了 Google Closure 库,大小约为 420 KB。 基于 libphonenumber 元数据的工具: * Scala: https://github.com/mr-tolmach/raf - 用于生成 E.164 格式有效电话号码的库
标签:Android开发, AsYouTypeFormatter, C++, CMS安全, Google, JavaScript, JS文件枚举, libphonenumber, Nuclei, SEO关键词:JavaScript手机号校验, SEO关键词:国际电话号码格式, SEO关键词:手机号验证API, 后端开发, 国际手机号, 字符串处理, 开源库, 搜索引擎爬虫, 数据可视化, 数据擦除, 数据验证, 文本提取, 电话号码格式化, 电话号码解析, 离线地理编码, 输入校验, 通信处理