E.164手机号格式:转换与校验方法
E.164手机号格式详解:格式规则、本地号码转换示例表、WhatsApp与短信API的要求、正则表达式和libphonenumber校验方法。
作者: OmniChannels.ai Editorial Team · 审阅: BroadNet Messaging Solutions Team
集成
简短回答
E.164是ITU-T制定的国际电话编号方案。E.164号码以加号开头,后接国家代码和国家内号码,最多15位数字,不含空格或标点,例如+971501234567。转换本地号码时,如果该国使用国内长途前缀(通常是0),就去掉它,再加上加号和国家代码,并删除空格和括号。
本页内容
要点速览
- E.164号码由加号、国家代码和国家内号码组成:总共最多15位数字,不含空格、短横线或括号。
- 转换就是去掉国内长途前缀(通常是0),但并非每个国家都有:ITU的拨号程序表中,意大利、西班牙和卡塔尔都没有列出。
- Meta建议WhatsApp发送请求中包含加号和国家拨号代码,因为缺少它们的号码会被加上发送方的国家代码,可能发给错误的人。
- 正则表达式只检查号码的形态;而libphonenumber这样的库会检查号码对该国是否有效。
- Excel可能丢掉前导零,并把长号码显示为科学记数法,所以请把手机号列保持为文本格式。
本指南面向为短信或WhatsApp处理手机号、需要把号码转成API可接受形式的营销人员、分析师和开发者。内容说明什么是E.164,演示如何转换不同国家的号码,并介绍代码中的校验方法,以及在号码发出之前就把它们损坏的电子表格问题。
什么是E.164格式?
E.164是国际公共电信编号方案,由ITU-T以建议书E.164的形式发布。日常中,这个词描述的是一种书写号码的方式:加号、国家代码和只含数字的国家内号码。
E.164号码由以下部分组成:
- **
+**代表国际呼叫前缀,各国不同(许多地方是00,美国是011)。 - **国家代码,**一到三位数字,例如阿联酋是971,美国和加拿大是1。
- **国家内号码,**即号码的其余部分,不含国内长途前缀。
建议书规定最大长度为15位数字,不含国际前缀。因此+971501234567是有效的E.164(12位数字),而17位的值不可能有效。我们的E.164词条给出了简短定义。
如何把本地手机号转换为E.164?
去掉格式,如果有国内长途前缀就去掉,然后加上加号和国家代码。
- 删除空格、短横线、点和括号。
050 123 4567变成0501234567。 - 如果号码带有国际呼叫前缀,就去掉它:
00971...或011...变成971...。 - **如果该国使用国内长途前缀,就去掉它。**许多国家是
0;美国和加拿大是1。 - 如果还没有国家代码,就加上。
- 加上加号。
要做到这一点,您需要知道号码所属的国家。0501234567只有附上国家才有意义,这就是电子表格应当带有国家列的原因。
不同国家的E.164号码是什么样的?
下表给出示例。这些号码只是说明用的占位号码,并非真实用户。拨号代码来自我们的法规数据;长途前缀来自ITU的拨号程序表。
| 国家 | 拨号代码 | 长途前缀(ITU表) | 本地形式(示例) | E.164 |
|---|---|---|---|---|
| 阿联酋 | +971 | 0 | 050 123 4567 | +971501234567 |
| 沙特阿拉伯 | +966 | 0 | 051 234 5678 | +966512345678 |
| 卡塔尔 | +974 | 未列出 | 5512 3456 | +97455123456 |
| 肯尼亚 | +254 | 0 | 0712 345 678 | +254712345678 |
| 英国 | +44 | 0 | 07700 900123 | +447700900123 |
| 德国 | +49 | 0 | 0151 12345678 | +4915112345678 |
| 印度 | +91 | 0 | 098765 43210 | +919876543210 |
| 西班牙 | +34 | 未列出 | 612 345 678 | +34612345678 |
| 意大利(手机) | +39 | 未列出 | 312 345 6789 | +393123456789 |
| 意大利(固话) | +39 | 未列出 | 06 1234 5678 | +390612345678 |
| 美国 | +1 | 1 | (202) 555-0123 | +12025550123 |
ITU表是2011年12月公布的状况,所以请把它当作了解规律的参考,具体到某个国家时,请用号码库或监管机构确认。
为什么意大利要保留开头的0?
因为在意大利,这个0是号码的一部分,而不是长途前缀。ITU的拨号程序表显示意大利(国家代码39)没有国内前缀,所以没有什么可去掉的。意大利的地区号码以0开头,如罗马风格的示例06 1234 5678,在国际格式中保留它:+390612345678。意大利手机号以3开头,没有零可保留,所以312 345 6789变成+393123456789。
不要把“一律去掉零”当作通用规则。同一张表也没有列出西班牙和卡塔尔的长途前缀,而且数据会变化,因此凡是无法手工核对的,都有理由使用号码库。
为什么短信和WhatsApp API需要E.164?
因为路由取决于无歧义的号码。没有国家代码的号码可能属于许多国家,平台就可能发往错误的市场、套用错误的发件人ID规则并按错误的费率计费。费率、发件人ID注册和营销发送时段都是按目的地国家应用的,而国家代码就是识别目的地的方式。
Meta对WhatsApp号码有什么说明?
Meta关于WhatsApp用户手机号格式的文档称,发送消息请求支持加号、连字符、括号和空格,并强烈建议包含加号和国家拨号代码。如果缺少加号,发送方的国家拨号代码会被加到号码前,可能导致消息发到错误的号码。Meta的示例:对于印度(代码91)的发送方,(631) 555-1234会被投递到+916315551234,而+1 (631) 555-1234则能正确投递。Meta还指出,对于巴西和墨西哥,Cloud API可能修改某些号码中出现的额外前缀,并称这是标准行为。
稳妥的做法是:保存干净的E.164,并原样发送。
短信呢?
短信API同样期望完整的国际号码。有些要求不带加号的数字;格式因API和协议而异,所以请查看您所用API的文档,并用自己的号码测试。工作示例请参阅通过API发送短信和通过API发送WhatsApp消息。
如何在代码中校验并规范化号码?
用正则表达式做快速的形态检查,用号码库做真正的校验。
一个常见的E.164形态检查:
// Plus, a non-zero first digit, then 1 to 14 more digits: 15 digits at most
const E164 = /^\+[1-9]\d{1,14}$/;
function looksLikeE164(value) {
return E164.test(value);
}
looksLikeE164("+971501234567"); // true
looksLikeE164("0501234567"); // false: no plus or country code
looksLikeE164("+0501234567"); // false: country codes do not start with 0
正则表达式只检查长度和字符。它会接受+99999999999,尽管并不存在这样的号码。要做真正的校验,请使用Google的开源libphonenumber,这是一个用于解析、格式化和校验国际电话号码的库,提供Java、C++和JavaScript版本,其他语言有社区移植版。它的README把isValidNumber描述为利用长度和前缀信息对某个地区进行的完整校验,并展示了如何把解析后的号码格式化为E.164。
# pip install phonenumbers (a Python port of libphonenumber)
import phonenumbers
def to_e164(raw, default_region):
try:
number = phonenumbers.parse(raw, default_region) # e.g. "AE", "SA", "GB"
except phonenumbers.NumberParseException:
return None
if not phonenumbers.is_valid_number(number):
return None
return phonenumbers.format_number(number, phonenumbers.PhoneNumberFormat.E164)
print(to_e164("050 123 4567", "AE")) # +971501234567 if the number is valid for the UAE
print(to_e164("+44 7700 900123", "GB"))
移植版由外部开发者编写,所以请检查您所选版本的质量。解析时使用取自客户所在国家的默认地区,然后保存E.164结果。同时保留原始输入,这样规则变化时可以重新解析。
请在录入环节规范化,也就是在注册表单、CRM导入或API中,而不是在发送时。同一个号码有两种写法,就会变成两个联系人,各自收到同一次活动。
如何修复电子表格中的手机号?
在输入或粘贴号码之前,把手机号列设为文本格式。常见问题如下:
| 问题 | 发生的情况 | 解决办法 |
|---|---|---|
| 前导零被去掉 | 0501234567变成501234567 |
先把单元格设为文本格式;或在输入内容前加撇号 |
| 科学记数法 | 长号码显示为9.71501E+11 |
设为文本格式;Excel只保持15位数值精度 |
| 加号丢失 | 数值单元格可能不保留+ |
设为文本格式,然后检查该列开头的字符 |
| 空格和短横线 | 971 50 123 4567 |
用查找和替换或SUBSTITUTE删除 |
| 缺少国家代码 | 只有本地号码 | 添加国家列;用公式构建号码 |
Microsoft的文档说明,Excel会去掉前导零并把大数字转换为科学记数法,而在应用文本格式之前输入的号码必须重新输入。直接打开CSV文件时,Excel会对每一列应用默认格式,所以请使用文本导入向导或“从文本/CSV”,把手机号列标记为文本。
对于以050 123 4567形式存放在A列的阿联酋手机号列表,下面的公式会把E.164构建为文本:
="+971"&RIGHT(SUBSTITUTE(A2," ",""),9)
它在删除空格后保留最后九位数字,所以只适用于这种形态的号码。保存为CSV之前,请复制结果并粘贴为值。手机号格式化工具无需公式即可转换号码,我们的用Excel或CSV群发短信指南介绍了完整的上传流程。
示例:清理客户名单
“Souq Rafiq”(虚构)是迪拜的一家零售商,从三个系统导出了8,000个联系人,号码形如0501234567、971 50 123 4567、+971-50-123-4567和00971501234567。
- 分析师根据每位客户的账单国家添加国家列。
- 脚本以该国家为默认地区解析每一行,于是四种格式都变成
+971501234567。 - 校验未通过的行进入审核表,而不是被发送。
- 规范化之后再去重,四种格式就合并成了一个联系人。
- 活动前,用HLR查询标出不活跃的号码。请参阅HLR查询详解。
- 干净的列存为文本并上传。
先规范化才使重复检查得以生效;在此之前,同一位客户看起来像四个人。
常见错误有哪些?
- **一律去掉开头的零。**有些国家(如意大利)没有长途前缀。
- **保留零又加上国家代码,**得到
+9710501234567。 - **向WhatsApp发送时不带加号,**导致被加上发送方的国家代码。
- **把正则表达式当作校验。**它检查的是形态,而不是有效性。
- **让Excel把手机号当作数字,**丢失零或变成科学记数法。
- **在发送时才规范化,**而不是在录入时。
- **以为格式有效就意味着号码可达。**已携号转网或已停机的号码仍会失败。
- **相信静态表格。**编号方案会变化;请使用持续维护的号码库。
OmniChannels.ai如何提供帮助
OmniChannels.ai通过一个REST API接受用于短信和WhatsApp的国际号码,其营销活动支持Excel和CSV上传,并带有预览和重复项过滤。BroadNet提供HLR和号码查询,因此您可以核实格式正确的号码是否在用。请阅读短信API文档和WhatsApp API文档了解确切的请求字段,或就开通事宜联系我们的团队。
常见问题
什么是E.164格式?
E.164是ITU-T建议书E.164定义的国际电话编号方案。日常使用中,E.164号码是加号、国家代码和只含数字的国家内号码,总共最多15位数字。它能在全球范围内唯一标识一个号码,这就是消息平台和API要求使用它的原因。
如何把手机号转换为E.164?
删除空格、短横线和括号。如果该国使用国内长途前缀(通常是开头的0),就去掉它。再加上加号和国家代码。于是阿联酋号码050 123 4567就变成+971501234567。意大利等国的固话号码要保留开头的0,所以请核对该国规则或使用号码库。
E.164号码最多可以有多少位数字?
最多15位,包括国家代码和国家内号码,但不含国际呼叫前缀。加号不算数字。许多国家内号码要短得多。超过15位的值不可能是有效的E.164号码,通常说明粘贴出错或电子表格单元格被损坏。
WhatsApp API需要加号吗?
Meta的文档称,发送消息请求支持加号、连字符、括号和空格,并强烈建议包含加号和国家拨号代码。没有加号时,发送方的国家拨号代码会被加到号码前,可能把消息发到另一个错误的号码。为稳妥起见,请发送完整的E.164。
为什么Excel会去掉零或改变我的手机号?
当手机号以数字形式输入时,Excel把它当作数值。Microsoft的文档说明,这会去掉前导零,并把长号码显示为科学记数法,因为Excel只保持15位精度。请在输入或粘贴号码之前把该列设为文本格式,或在输入内容前加撇号,并重新输入之前键入的号码。
有效的E.164号码也一定能联系上吗?
不一定。号码可能格式正确,却是未分配、已停机或已携号转网的。格式校验检查的是某个国家的号码形态和长度。要了解号码是否活跃以及属于哪个网络,请在大规模发送前使用HLR或号码查询。
资料来源
- Recommendation ITU-T E.164: The international public telecommunication numbering plan
- Dialling procedures (international prefix, national (trunk) prefix and national (significant) number), ITU Operational Bulletin No. 994, 15.XII.2011
- WhatsApp user phone number formats — WhatsApp Business Platform, Meta for Developers
- Keeping leading zeros and large numbers — Microsoft Support
- libphonenumber — Google, open-source library on GitHub
继续阅读
更多指南集成
短信验证码自动填充:Android、iOS与网页格式指南
讲解Android、iOS和网页上的验证码自动填充:SMS Retriever哈希、域名绑定验证码、WebOTP、适用三端的统一短信格式,以及WhatsApp自动填充。
9 分钟阅读
集成
WhatsApp Cloud API吞吐量与速率限制详解
WhatsApp Cloud API吞吐量与速率限制:每秒消息数、如何提升、配对与Graph API限制、相关错误码,以及带退避的重试方法,助您稳妥完成大批量发送。
9 分钟阅读
营销
WhatsApp 与短信自动预约提醒:完整指南
面向诊所、美容美发、酒店和上门服务企业的预约提醒指南:如何用 WhatsApp 与短信设计提醒时间、消息模板、确认与改期按钮,以及 WhatsApp 失败后的短信兜底方案,并教你把客户的每条回复同步到日历、减少爽约、提高时段利用率。
8 分钟阅读
