手机号码校验归属地
前言
最近公司有一个需求是校验公司产品的使用用户所属手机号码归属地分布情况。于是在网上找寻了一下发现github上libphonenumber类库非常符合自身的需求。Libphonenumber是Google 的通用 Java、C++ 和 JavaScript 库,用于解析、格式化和验证国际电话号码。Java 版本针对在智能手机上运行进行了优化,自 4.0 (Ice Cream Sandwich) 起就被 Android 框架使用。
Libphonenumber三个核心包,分别为:Libphonenumber,Geocoder,Carrier
使用谷歌公共电话号码解析库
导入最新maven包(最新)
<dependency> |
执行代码块:
PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
PhoneNumberOfflineGeocoder phoneNumberOfflineGeocoder = PhoneNumberOfflineGeocoder.getInstance();
String language ="CN";
String phoneNum = "13111111111";
Phonenumber.PhoneNumber referencePhonenumber = null;
try {
referencePhonenumber = phoneUtil.parse(phoneNum, language);
} catch (NumberParseException e) {
e.printStackTrace();
}
String referenceRegion = phoneNumberOfflineGeocoder.getDescriptionForNumber(referencePhonenumber, Locale.CHINA);
if(StringUtils.isEmpty(referenceRegion)){
System.out.println("未知地域号码:"+phoneNum);
}
System.out.println("referencePhonenumber:"+referencePhonenumber);
//手机号码归属城市 referenceRegion
System.out.println("referenceRegion:"+referenceRegion); |
libphonenumber原理
libphonenumber原理其实特别简单,首先根据当前提供的手机号码以及区域信息转成phoneNumber对象,如我国用“CN“代替,并对应的是86大陆区号。然后根据该对象信息去对应的86.txt文件中索引匹配。
https://github.com/google/libphonenumber/tree/master/resources/geocoding/zh
不足11位的手机号码是无法找到对应的区域,若满足以上条件(区域+11位号码)就会根据前匹配找数据。就算用户输入的是字符,也会转成数字。比如“131xxxxxxxx“就会转成”13199999999“。需要注意的一点是86.txt更新时间为3年以前,如果有新号码格式就会出现匹配不正确的情况。