【编程开发】之国际号码校验工具 Libphonenumber
程序员文章站
2022-04-04 12:18:05
...
一、Libphonenumber 简介
1、Libphonenumber 是什么
Libphonenumber 是谷歌公司开发的一款用于解析、格式化和校验国际手机号码的软件库,可用于 Java、C++ 和 JavaScript 中。
Libphonenumber 官方文档地址为:https://github.com/google/libphonenumber
2、国家代号与电话区号
国家代号(CountryCode):
国家代号,即国际域名缩写,是为了便于区分国家而使用的名称,由两个大写字母组成,比如,中国的代号为 CN,美国为 US。
电话区号(AreaCode):
国际电话区号,即国际电信联盟根据 E.164 标准
分配给各国或特殊行政区的 代码
。所有的号码都是前缀号,也就是说这些号码是用来“拨到”目的国家或特殊行政区。每一个国家还有一个前缀来“拨出”所在国家,这个前缀叫 国际冠码
。比如,中国的国际电话区号为 86,美国的国际电话区号为 1。
更多国家代号与电话区号可以参考我的另一篇博客:https://blog.csdn.net/aiwangtingyun/article/details/110940112
二、Libphonenumber 实战 - Java
1、引入依赖
<dependency>
<groupId>com.googlecode.libphonenumber</groupId>
<artifactId>libphonenumber</artifactId>
<version>8.12.10</version>
</dependency>
2、校验号码是否有效
下面我们以瑞士号码校验为例:
import com.google.i18n.phonenumbers.NumberParseException;
import com.google.i18n.phonenumbers.PhoneNumberUtil;
import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber;
import org.junit.Test;
@Test
public void validatePhone() {
// 校验的号码
String swissNumberStr = "044 668 18 00";
// 获取 PhoneNumberUtil 实例
PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
try {
// 解析号码
PhoneNumber swissNumberProto = phoneUtil.parse(swissNumberStr, "CH");
// 校验号码
boolean isVaild = phoneUtil.isValidNumber(swissNumberProto); // return true
System.out.println("号码校验结果:" + isVaild);
} catch (NumberParseException e) {
System.err.println("号码解析异常: " + e.toString());
}
}
号码的校验使用的是 PhoneNumberUtil 工具类,一般都是获取该工具类的实例进行操作。校验号码前需要通过 号码字符串 + 国家代号
来解析成国际通过的号码,解析后生成 PhoneNumber 类的对象 swissNumberProto(PhoneNumber
是一个由 phonenumber.proto
生成的一个类) ,其包含如下数据:
{
"country_code": 41,
"national_number": 446681800
}
其中:
-
country_code
为国际电话区号; -
national_number
为该号码对应的国际号码。
3、号码格式化
我们还可以对解析后的号码按不同标准进行格式化:
// 国际标准, 输出 "+41 44 668 18 00"
System.out.println(phoneUtil.format(swissNumberProto, PhoneNumberFormat.INTERNATIONAL));
// 国内标准, 输出 "044 668 18 00"
System.out.println(phoneUtil.format(swissNumberProto, PhoneNumberFormat.NATIONAL));
// E164标准, 输出 "+41446681800"
System.out.println(phoneUtil.format(swissNumberProto, PhoneNumberFormat.E164));
或者格式化成从其他国家打过来的格式:
// 格式化成从美国打过来的格式,输出 "011 41 44 668 18 00"
System.out.println(phoneUtil.formatOutOfCountryCallingNumber(swissNumberProto, "US"));