欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【编程开发】之国际号码校验工具 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"));