返回资讯中心
外部精选
软件工程
#开发者实时流

Google 开源电话号码解析与验证库,Android 4.0 起采用

来源标题:Google's common library for parsing, formatting, and validating phone numbers

Google 提供一套跨 Java、C++ 和 JavaScript 的国际电话号码解析、格式化与验证库。其中 Java 版本针对智能手机优化,自 Android 4.0(Ice Cream Sandwich)起被 Android 框架采用。该库支持全球各国家/地区号码,可识别固定电话、移动电话、免费电话、VoIP 等类型,并能判断两个号码是否可能相同。

Hacker News 最新cimnine2026/11/3 · 4 天前19 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

Google 提供的通用 Java、C++ 和 JavaScript 库,用于解析、格式化和验证国际电话号码。Java 版本针对智能手机运行进行了优化,自 Android 4.0(Ice Cream Sandwich)起被 Android 框架使用。

报告问题?想要提交 pull request?请参阅贡献指南。

查看常见问题。

有趣!程序员对电话号码的错误认知。

在你感兴趣的代码相关目录中查找 README。

致贡献者和移植者:如何运行 Java demo

致移植者:如何进行元数据变更

功能亮点

解析、格式化和验证全球所有国家/地区的电话号码。

getNumberType —— 根据号码本身获取号码类型;能够区分固定电话、移动电话、免费电话、付费电话、共享成本电话、VoIP、个人号码、UAN、寻呼机和语音信箱(在可行的情况下)。

isNumberMatch —— 获取两个号码是否可能相同的置信度。

getExampleNumber 和 getExampleNumberForType —— 为所有国家/地区提供有效的示例号码,并可选择指定需要哪种类型的示例电话号码。

isPossibleNumber —— 仅使用长度信息快速猜测一个号码是否是可能的电话号码,比完整验证快得多。

isValidNumber —— 使用长度和前缀信息对某个地区的电话号码进行完整验证。

AsYouTypeFormatter —— 在用户输入每个数字时即时格式化电话号码。

findNumbers —— 在文本中查找号码。

PhoneNumberOfflineGeocoder —— 提供与电话号码相关的地理信息。

PhoneNumberToCarrierMapper —— 提供与电话号码相关的运营商信息。

PhoneNumberToTimeZonesMapper —— 提供与电话号码相关的时区信息。

Demo

Java

Java demo 在 GitHub 发布后会稍有延迟地更新。

注意:尽管该库(main 分支/maven 发布版)已到 v8.12.57,但由于一些部署问题,我们无法用新的二进制版本更新 Java demo。我们会尽快修复。在此期间,请使用 JS demo。

如果此号码低于最新发布版的版本号,说明我们正处于两次发布之间,demo 可能处于任一版本。

本仓库中有一个名为 E.164 Formatter 的 demo Android 应用。该应用的目的是展示该库如何在真实场景中使用,在此例中具体是使用 Java 的 Android 应用。

JavaScript demo 可以在各个 tag 上运行;此链接将带你到 master。

要将 Java 代码包含在你的应用中,可以集成 Maven(参见 wiki),或从 Maven 仓库下载最新的 jar 包。

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。

否则,包括发布仅包含元数据变更时,我们发布一个子次版本,例如 7.7.3 到 7.7.4。

有时我们对代码或元数据进行内部更改,这些更改虽然不影响客户端的兼容性,但可能影响该库移植者的兼容性。对于此类更改,我们会在 libphonenumber-discuss 上发布公告。此类更改不会反映在版本号中,如果没有其他更改,我们会发布一个子次版本。

想要获得新版本通知?一年中的大部分时间,除节假日和特殊情况外,我们每两周发布一次。我们会更新发布 tag,并记录详细的发布说明。

我们还会为每次发布向 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");

(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →