要通过电话通讯的话,需要知道对方的电话号码。不同国家地区、不同通讯设备,它们的电话号码的格式有非常多的种类。
以下内容引用自知乎 国际电话号码标准格式与解析 – 知乎 (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位。
参考资料
- 国际冠码: 国际冠码
- 国际电话区号: 国际电话区号
- 中国大陆电话区号: 中国大陆电话区号
- 中国大陆移动号段:中国大陆移动号段
- RFC3966: https://tools.ietf.org/html/rfc
在实际使用中,又碰到一些问题,比如中国特有的号码格式,有些并未收录到库中,导致用这个库解析那些特有格式的号码会出错,比如最简单的5位数955xx这一类的号码,就会解析出错。
目前我暂时是忽略这一类号码的错误,默认认为5位数的号码都是valid有效的。当然也还有一些其他的特殊号码需要处理。
关于中国的电话号码格式,可以参考wiki:Telephone numbers in China – Wikipedia
至于苹果系统使用的是什么样的规范来解析电话号码,暂时没有明确的资料。
我在开发测试过程中发现了一个现象:
上面那个代表腾讯手机管家的数据库里录入的是8610086,所以它能匹配到+8610086,而匹配不到10086。
下面那个代表我开发的“短信来电过滤”app,我录入的是10086,所以它能匹配到10086,而不能匹配到+8610086 。
当然匹配是有优先级的,优先级可以在系统设置里调整,参考下图:
点击右上角的“编辑”,即可拖动下面的内容进行排序,排名靠上的优先级更高