@@ -5,6 +5,10 @@ authors: [wjc133]
55tags : [电信]
66---
77
8+ 工作原因经常需要处理手机号,一般都是用一些开源库来解析。最近看了一下开源库的实现,发现对电话号码的定义还挺复杂的。所以结合之前了解到的一些 PSTN 的知识对电话和电话号码相关的内容进行了整理。
9+
10+ <!-- truncate -->
11+
812## PSTN
913### 概念
1014PSTN 距离我们很近,以前家里使用的电话机,一般情况下都连接到两类设备上 —— 一类是通过电话线直接连接电信机房的交换机,另外一类是先连接到一台用户交换机,然后连接到电信机房的交换机上。前者一般是家庭和小企业用户,或者大企业里面的 VIP 用户;后者一般是企业用户。
@@ -80,27 +84,27 @@ VoIP 通过互联网传输语音数据,减少了传统电信网络的通话费
8084### 国际公共电话号码基本格式
8185国际电话号码格式遵循 E.164 规范,即:[ https://www.itu.int/rec/t-rec-e.164/en ] ( https://www.itu.int/rec/t-rec-e.164/en )
8286
83- < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > 该建议书提供了用于国际公共电信编号计划的号码结构和功能,适用于全球公共交换电话网络(PSTN)以及一些其他数据网络</ font >< font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " >。</ font >
87+ 该建议书提供了用于国际公共电信编号计划的号码结构和功能,适用于全球公共交换电话网络(PSTN)以及一些其他数据网络。
8488
85- ** < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > 号码组成</ font > **
89+ ** 号码组成**
8690
87- + < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > 国家代码:由 1 到 3 位数字组成,用于唯一标识每个国家或地区,如中国是 86,美国和加拿大是 1。</ font >
88- + < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > 国内目的地码:包含国内地区码等信息,其长度根据各国情况有所不同,用于标识国内的特定地区或网络。</ font >
89- + < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > 用户号码:用于区分同一地区或网络内的不同用户。</ font >
91+ - 国家代码:由 1 到 3 位数字组成,用于唯一标识每个国家或地区,如中国是 86,美国和加拿大是 1。
92+ - 国内目的地码:包含国内地区码等信息,其长度根据各国情况有所不同,用于标识国内的特定地区或网络。
93+ - 用户号码:用于区分同一地区或网络内的不同用户。
9094
91- < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > 完整的 E.164 号码总长度不超过 </ font > ** < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > 15 位</ font > ** < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " >。</ font >
95+ 完整的 E.164 号码总长度不超过 15 位。
9296
9397![ ] ( img/02.png )
9498
95- ** < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > 号码格式</ font > **
99+ ** 号码格式**
96100
97- < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > 国际格式:通常以 “+” 开头,后面紧跟国家代码,再加上国内号码,中间可以用空格或短横线分隔,如 “+86 10-12345678” 或 “+86-10-12345678”。</ font >
101+ 国际格式:通常以 “+” 开头,后面紧跟国家代码,再加上国内号码,中间可以用空格或短横线分隔,如 “+86 10-12345678” 或 “+86-10-12345678”。
98102
99- < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > 拨号格式:在实际拨号时,需要根据所在国家或地区的规定,可能需要在拨打国际号码前加上国际长途接入码,如在中国拨打国际电话,通常要先拨 “00”,然后再拨 E.164 号码。</ font >
103+ 拨号格式:在实际拨号时,需要根据所在国家或地区的规定,可能需要在拨打国际号码前加上国际长途接入码,如在中国拨打国际电话,通常要先拨 “00”,然后再拨 E.164 号码。
100104
101- < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > 各国的电信管理机构负责在本国范围内按照 E.164 的规定分配和管理电话号码资源,确保号码的唯一性和合理性。</ font >
105+ 各国的电信管理机构负责在本国范围内按照 E.164 的规定分配和管理电话号码资源,确保号码的唯一性和合理性。
102106
103- ### < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > 带子地址的电话号码格式</ font >
107+ ### 带子地址的电话号码格式
104108除了基本的电话号码外,ISDN 还支持子地址,用于在一个电话号码下进一步区分不同的用户终端或业务应用。格式通常是在基本电话号码后加上 “;” 和子地址信息。
105109
106110例如:` +86 10 12345678;1234 ` ,这里的 “1234” 就是子地址,可能用于区分同一用户的不同终端设备或不同业务功能。
@@ -110,7 +114,7 @@ VoIP 通过互联网传输语音数据,减少了传统电信网络的通话费
110114### 国内固定电话的号码格式
111115![ ] ( img/03.png )
112116
113- < font style = " color : #DF2A3F ; " > 注意:国外号码会有不同的规则,仅 ITU 编号部分是国际规范。</ font >
117+ ** 注意:国外号码会有不同的规则,仅 ITU 编号部分是国际规范。**
114118
115119** 国内区号** :一些重要城市和区域中心城市使用三位区号,如北京为 “010”、上海为 “021”、天津为 “022”、重庆为 “023” 等。这些城市通常在政治、经济、文化等方面具有重要地位,是全国或区域的重要枢纽。除了上述使用三位区号的城市外,国内其他地区的区号一般为四位,如广州的 “020” 后面还有四位本地号码,其他中小城市和地区像成都 “028”、杭州 “0571”、深圳 “0755” 等,都是四位区号加本地号码。
116120
@@ -127,7 +131,7 @@ VoIP 通过互联网传输语音数据,减少了传统电信网络的通话费
127131+ ** 地区编码** :中间 4 位数字可以在一定程度上反映手机号码的归属地信息,但并非严格对应特定的地理区域,同一地区可能会有多个不同的 4 位编码。
128132+ ** 用户号码** :最后 4 位是用户在所属地区和网络中的唯一标识,用于区分同一地区、同一运营商下的不同用户。
129133
130- ## < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > 使用 URI 表示电话号码</ font >
134+ ## 使用 URI 表示电话号码
131135[ RFC 3966] ( https://www.rfc-editor.org/rfc/rfc3966.html ) (“The tel URI for Telephone Numbers”)规定了一种使用统一资源标识符(URI)来表示电话号码的标准方式,目的是让电话号码能在互联网应用中被方便识别、交换和处理。
132136
133137### tel URI 的语法结构
@@ -172,47 +176,47 @@ VoIP 通过互联网传输语音数据,减少了传统电信网络的通话费
172176
173177关注一下` context = ";phone-context=" descriptor ` ,phone-context 即电话号码的上下文,是在一些通信系统或配置中用于标识电话号码所属的特定环境或上下文的概念,比如在企业 IP 电话系统中,不同的分支机构或部门可能有不同的 phone-context。
174178
175- < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > 示例:</ font >
179+ 示例:
176180
1771811 . ** 国际号码**
178182
179183``` plain
180184tel:+442071838750
181185```
182186
183- < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > 这里 </ font > ` <font style="color:rgba(0, 0, 0, 0.85);"> +44</font> ` < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > 代表英国,</ font > ` <font style="color:rgba(0, 0, 0, 0.85);"> 207</font> ` < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > 代表伦敦区号,</ font > ` <font style="color:rgba(0, 0, 0, 0.85);"> 1838750</font> ` < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > 是本地号码。</ font >
187+ 这里 +44 代表英国,207 代表伦敦区号,1838750 是本地号码。
184188
185- 2 . ** 局部号码(带 ** ` **<font style="color:rgba(0, 0, 0, 0.85);"> phone-context</font>** ` ** )**
189+ 1 . ** 局部号码(带 ` phone-context ` )**
186190
187191``` plain
188192tel:1838750;phone-context=+44-207
189193```
190194
191- < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > 这里 </ font > ` <font style="color:rgba(0, 0, 0, 0.85);"> phone-context=+44-207</font> ` < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > 表示该号码属于 </ font > ` <font style="color:rgba(0, 0, 0, 0.85);"> +44</font> ` < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > 英国的 </ font > ` <font style="color:rgba(0, 0, 0, 0.85);"> 207</font> ` < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > 伦敦区号。</ font >
195+ 这里 phone-context=+44-207 表示该号码属于 +44 英国的 207 伦敦区号。
192196
1931973 . ** 企业内部拨号**
194198
195- < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > 如果一个企业的电话系统支持分机号(如 1234),但需要在特定企业网域解析:</ font >
199+ 如果一个企业的电话系统支持分机号(如 1234),但需要在特定企业网域解析:
196200
197201``` plain
198202tel:1234;phone-context=example.com
199203```
200204
201- < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > 这里 </ font > ` <font style="color:rgba(0, 0, 0, 0.85);"> phone-context=example.com</font> ` < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > 说明 </ font > ` <font style="color:rgba(0, 0, 0, 0.85);"> 1234</font> ` < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > 这个号码应该在 </ font > ` <font style="color:rgba(0, 0, 0, 0.85);"> example.com</font> ` < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > 这个企业域内解析。</ font >
205+ 这里 phone-context=example.com 说明 1234 这个号码应该在 example.com 这个企业域内解析。
202206
203- < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > 这里可以看出,phone-context 是用于指明电话号码的适用范围的,如果该内部电话系统最终会接入到 PSTN 上,那么就跟上面说的 isdn 子地址一样了,只不过是不同的表示形式。</ font >
207+ 这里可以看出,phone-context 是用于指明电话号码的适用范围的,如果该内部电话系统最终会接入到 PSTN 上,那么就跟上面说的 isdn 子地址一样了,只不过是不同的表示形式。
204208
205- ### < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > 电话号码表示</ font >
209+ ### 电话号码表示
206210推荐使用国际电信联盟(ITU) E.164 标准格式来表示电话号码,例如:tel:+861012345678 表示中国北京的一个号码。
207211
208212** 参数使用** :
209213
210- + < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > 指定电话号码的分机号码,如 </ font > ` tel:1234567890;ext=567 `
211- + < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > 标识电话类型,取值如 </ font > ` type=voice ` < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > (语音电话) 、</ font > ` type=fax ` < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > (传真) 等。多个类型值可用逗号分隔,如 </ font > ` tel:1234567890;type=voice,fax `
212- + < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > 标识特定的电话上下文或环境,例如在企业内部不同分支机构可能有不同的上下文,如 </ font > ` tel:1234567890;phone-context=office1 `
214+ - 指定电话号码的分机号码,如 ` tel:1234567890;ext=567 `
215+ - 标识电话类型,取值如 ` type=voice(语音电话) ` 、 ` type=fax(传真) ` 等。多个类型值可用逗号分隔,如 ` tel:1234567890;type=voice,fax `
216+ - 标识特定的电话上下文或环境,例如在企业内部不同分支机构可能有不同的上下文,如 ` tel:1234567890;phone-context=office1 `
213217
214218### 应用场景
215- < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > 最简单的,在网页中,可通过创建 </ font > ` tel: ` < font style = " color : rgba ( 0 , 0 , 0 , 0.85 ); " > URI 链接,使用户点击链接就能直接调用设备的拨打电话功能。比如在 HTML 中:</ font > ` <a href="tel:+12125551212">Call this number</a> `
219+ 最简单的,在网页中,可通过创建 ` tel: URI ` 链接,使用户点击链接就能直接调用设备的拨打电话功能。比如在 HTML 中:` <a href="tel:+12125551212">Call this number</a> `
216220
217221## 电话号码的解析库
218222Java 可以使用 Google 提供的 libphonenumber。很多 App 的手机号码归属地等功能就是使用这个实现的。支持 Java, C++ 和 JavaScript。
0 commit comments