libphonenumber 快速实践:解析与校验国际电话号码
【免费下载链接】libphonenumberGoogle's common Java, C++ and JavaScript library for parsing, formatting, and validating international phone numbers.项目地址: https://gitcode.com/GitHub_Trending/li/libphonenumber
格式五花八门、真假难辨、归属地查不到——电话号码处理总让人头疼。libphonenumber 是 Google 出品的国际电话号码解析库:把各种格式的号码解析、验证、格式化一次搞定,覆盖全球 200 多个国家和地区。
它到底解决了什么
写过校验手机号的正则就知道这事有多棘手:各国号码长度不同,区号、国家前缀规则各异,还有大量号段在不断调整。libphonenumber 就是为此而生——Google 官方维护的号码规则,覆盖 200+ 国家/地区,从 Android 4.0 起内置于系统中。注册表单校验、客服外呼、数仓里清洗历史数据这三类活,都可以不用再自建规则库。
仓库按语言组织,日常用得到的四个位置:
- Java 核心库:java/libphonenumber/
- C++ 实现:cpp/src/phonenumbers/
- JavaScript 版本:javascript/i18n/phonenumbers/
- 号码元数据:
metadata/目录,含打包好的metadata.zip与更新工具
最短路径跑起来
先拉源码:
git clone https://gitcode.com/GitHub_Trending/li/libphonenumber
下面是最小完整示例,一次把解析、验证、格式化做完(以 Java 版为例,C++ 与 JS 版 API 思路一致):
import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber; import com.google.i18n.phonenumbers.Phonenumber.PhoneNumberFormat; PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(); String swissNumberStr = "044 668 18 00"; // 瑞士本地格式 try { PhoneNumber proto = phoneUtil.parse(swissNumberStr, "CH"); // 第二个参数:默认国家代码 System.out.println(phoneUtil.isValidNumber(proto)); // 验证真假 System.out.println(phoneUtil.format(proto, PhoneNumberFormat.E164)); } catch (NumberParseException e) { System.err.println("解析失败: " + e); }预期输出两行:true和+41446681800。解析后的PhoneNumber对象里,国家代码是 41,国内号码部分是 446681800,后续所有操作都基于这个对象。
format提供三种常用形态,用途不同:
| 格式 | 示例输出 | 常见用途 |
|---|---|---|
| INTERNATIONAL | +41 44 668 18 00 | 对外展示,带国际拨号前缀 |
| NATIONAL | 044 668 18 00 | 面向国内用户的本地展示 |
| E164 | +41446681800 | 入库存储、传输、号码去重 |
不想写代码先感受一下,JavaScript 版自带网页 demo:javascript/i18n/phonenumbers/demo.html,浏览器里输入号码、默认国家代码(CLDR 双字母码),可选填运营商代码即可看到解析结果。
三个高频场景逐个拆
边输入边整理:实时格式化
用户还在敲数字时,就按当地习惯实时分隔号码,而不是提交后统一重排。AsYouTypeFormatter就是干这个的:
AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("US"); System.out.println(formatter.inputDigit('6')); // 输出 6 System.out.println(formatter.inputDigit('5')); // 输出 65 // ... 继续输入剩余数字 System.out.println(formatter.inputDigit('3')); // 输出 650 253每输入一位就把返回值赋给输入框即可。空格插在哪、何时切换国家前缀,全部由库按目标国家规则处理,你不需要写任何格式化逻辑。
验证 + 归属地:判断真假并拿到地区名
号码验证通过后,想知道"这个号在哪",用 geocoder 模块,同一个号码可以传不同Locale拿到多语言地区名:
PhoneNumberOfflineGeocoder geocoder = PhoneNumberOfflineGeocoder.getInstance(); System.out.println(geocoder.getDescriptionForNumber(proto, Locale.ENGLISH)); System.out.println(geocoder.getDescriptionForNumber(proto, Locale.GERMAN));预期输出:Zurich(英语)、Zürich(德语)。归属地映射数据存放在 java/geocoder/src/com/google/i18n/phonenumbers/geocoding/ 目录下。
批量提取:从一段杂文中捞出所有号码
清洗用户留言、注册说明这类自由文本时,findNumbers负责把号码全部捞出来:
String text = "请联系我们:+1 650 253 0000 或发送邮件至support@example.com"; Iterable<PhoneNumberMatch> matches = phoneUtil.findNumbers(text, "US"); for (PhoneNumberMatch match : matches) { System.out.println(match.number()); }预期输出:+1 650 253 0000。文本里唯一的号码被提取出来,邮箱这类内容不会混进来。
接到应用里的完整链路
以仓库自带的 Android 示例应用java/demoapp/为参照,集成就是四步:
- 加依赖:示例应用基于 Maven 模块
java/libphonenumber/,在 build.gradle 里加上对应依赖即可。 - 初始化:
PhoneNumberUtil.getInstance()是单例,进程里取一次,全局复用。 - 调用:用户在界面选择国家后,把该国家代码连同输入号码传给
parse,再走验证与格式化,核心逻辑见 MainActivity.java。 - 界面回显:主界面是"国家下拉框 + 输入区"的组合,解析、验证结果直接展示在输入区下方。XML 里关键只有一个自定义控件:
<com.google.phonenumbers.demoapp.main.CountryDropdown android:id="@+id/country_dropdown" android:layout_width="@dimen/main_activity_default_width_item" android:layout_height="wrap_content" app:layout_constraintTop_toBottomOf="@id/tv_country_dropdown_label" />想先跑通 Web 端 demo 看效果的话,java/demo/可以在 IDE 里以 App Engine 本地服务方式启动,Run/Debug 配置大致如下:
这些坑先知道
默认国家代码不能省:像
044 668 18 00这种本地格式号码,parse的第二个参数必须给出 CLDR 双字母国家代码,否则定位不到号码所属国家,抛NumberParseException。
存储与展示分格式:数据库里存 E.164(无空格符号、便于去重),展示时再实时转成 INTERNATIONAL 或 NATIONAL。直接把展示字符串入库,同一个号码会以多种形式散落各处。
号码规则会变:各国号码规则会调整,库内置的元数据 metadata/metadata.zip 需要定期更新,更新流程在仓库根目录的
making-metadata-changes.md里有完整说明。
libphonenumber 把国际电话号码解析的几件核心事——解析、验证、格式化、批量提取——收敛在PhoneNumberUtil一个入口上,归属地查询由 geocoder 模块补齐。更多细节看 README.md 和 FAQ.md,Java 测试目录java/libphonenumber/test/com/google/i18n/phonenumbers/里的大量用例也能直接当参考实现。号码规则随版本持续演进,升级前建议过一遍release_notes.txt,保持较新版本能拿到最新的规则与修复。
【免费下载链接】libphonenumberGoogle's common Java, C++ and JavaScript library for parsing, formatting, and validating international phone numbers.项目地址: https://gitcode.com/GitHub_Trending/li/libphonenumber
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考