短信来电过滤-开发日志-电话号码格式篇

marmelroy/PhoneNumberKit: A Swift framework for parsing, formatting and validating international phone numbers. Inspired by Google’s libphonenumber. (github.com)

要通过电话通讯的话,需要知道对方的电话号码。不同国家地区、不同通讯设备,它们的电话号码的格式有非常多的种类。

以下内容引用自知乎 国际电话号码标准格式与解析 – 知乎 (zhihu.com)

国际电话号码格式

国际上对于电话号码有一个固定的标准格式,但因为日常情况下我们常用电话号码都在本国或者本区域内,不需要每次都主动拨打完整的电话号码,所以很多人对电话号码不是完全了解,这里我们解释一下。

国际电话号码由以下关键部分组成:

国际冠码 / 国际电话区号 / 电话号码

00/86/2150504740

+/86/13112345678

  • 国际冠码:拨出电话时候,由拨出地区确定的一个前缀,不同国家使用不同的标准,比如中国大陆使用 “00” 为国际冠码,拨打国际电话的时候要根据拨出地区确定国际冠码,同时,由于这个冠码太繁琐,可以使用“+”来代替任何国家的国家冠码。
  • 国际电话区号:每个国家分配的一个代码,我们熟悉的 ”86“ 是中国大陆, ”852“是中国香港,”1“ 是美国。“+86”就是由国际冠码与国际电话区号组成的。
  • 电话号码:有了上述两个部分,电话号码就确定了国家(地区),剩下的部分就是内部的电话号码了,每个不同国家、不同地区,都有可能有自己内部的电话号码格式,不过这个部分就是日常生活中最常用的部分,大家会熟悉很多。

举例: 假设我香港的朋友,告诉我他的电话号码是 51231234,我要给他打电话: 1. 我需要确定我是从中国大陆拨打电话,中国大陆的国际冠码是 00,或者我不知道我的国际冠码,直接用通用的冠码 +
2. 我需要确定香港地区的电话区号,是 852; 3. 在朋友给我的号码前面加上上述号码,拨打 0085251231234 或者 +85251231234 才能正确拨打。

中国大陆固定电话号码格式

中国大陆有两种常见电话号码,第一种就是我们常说的“固定电话”,固定电话的格式定义逻辑和国际标准类似:

长途冠码/省市区号/电话号码

0/10/12345678

长途冠码:在国内拨打长途电话,需要添加长途冠码 0

省市区号:不同省、直辖市、大型城市分配的代号,比如北京市 10,长途冠码和省市区号连起来,就是我们很熟悉城市长途代码 010(北京市) 0532(青岛市)

电话号码: 之后的部分才是固定电话的电话号码,7位或者8位

中国大陆移动电话号码格式

中国大陆的移动电话号码是 11 位,格式标准如下:

运营商/归属地/客户号码

1xx/0106/1111

所以,移动手机号码规范的朗读方式应该是 3位-4位-4位。

参考资料

在实际使用中,又碰到一些问题,比如中国特有的号码格式,有些并未收录到库中,导致用这个库解析那些特有格式的号码会出错,比如最简单的5位数955xx这一类的号码,就会解析出错。

目前我暂时是忽略这一类号码的错误,默认认为5位数的号码都是valid有效的。当然也还有一些其他的特殊号码需要处理。

关于中国的电话号码格式,可以参考wiki:Telephone numbers in China – Wikipedia

至于苹果系统使用的是什么样的规范来解析电话号码,暂时没有明确的资料。

我在开发测试过程中发现了一个现象:

上面那个代表腾讯手机管家的数据库里录入的是8610086,所以它能匹配到+8610086,而匹配不到10086。

下面那个代表我开发的“短信来电过滤”app,我录入的是10086,所以它能匹配到10086,而不能匹配到+8610086 。

当然匹配是有优先级的,优先级可以在系统设置里调整,参考下图:

点击右上角的“编辑”,即可拖动下面的内容进行排序,排名靠上的优先级更高

点击右上角的“编辑”,即可拖动下面的内容进行排序,排名靠上的优先级更高

amadman
amadman

iOS,macOS,Web,STM32,Unity3D,Blender,ML,AI

Articles: 12