跳转到正文
OmniChannels.ai

E.164手机号格式:转换与校验方法

E.164手机号格式详解:格式规则、本地号码转换示例表、WhatsApp与短信API的要求、正则表达式和libphonenumber校验方法。

更新于 9 分钟阅读

作者: OmniChannels.ai Editorial Team · 审阅: BroadNet Messaging Solutions Team

集成

简短回答

E.164是ITU-T制定的国际电话编号方案。E.164号码以加号开头,后接国家代码和国家内号码,最多15位数字,不含空格或标点,例如+971501234567。转换本地号码时,如果该国使用国内长途前缀(通常是0),就去掉它,再加上加号和国家代码,并删除空格和括号。

本页内容
  1. 什么是E.164格式?
  2. 如何把本地手机号转换为E.164?
  3. 不同国家的E.164号码是什么样的?
  4. 为什么意大利要保留开头的0?
  5. 为什么短信和WhatsApp API需要E.164?
  6. 如何在代码中校验并规范化号码?
  7. 如何修复电子表格中的手机号?
  8. 示例:清理客户名单
  9. 常见错误有哪些?
  10. OmniChannels.ai如何提供帮助

要点速览

  • 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?

去掉格式,如果有国内长途前缀就去掉,然后加上加号和国家代码。

  1. 删除空格、短横线、点和括号。050 123 4567变成0501234567。
  2. 如果号码带有国际呼叫前缀,就去掉它:00971...或011...变成971...。
  3. **如果该国使用国内长途前缀,就去掉它。**许多国家是0;美国和加拿大是1。
  4. 如果还没有国家代码,就加上。
  5. 加上加号。

要做到这一点,您需要知道号码所属的国家。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。

  1. 分析师根据每位客户的账单国家添加国家列。
  2. 脚本以该国家为默认地区解析每一行,于是四种格式都变成+971501234567。
  3. 校验未通过的行进入审核表,而不是被发送。
  4. 规范化之后再去重,四种格式就合并成了一个联系人。
  5. 活动前,用HLR查询标出不活跃的号码。请参阅HLR查询详解。
  6. 干净的列存为文本并上传。

先规范化才使重复检查得以生效;在此之前,同一位客户看起来像四个人。

常见错误有哪些?

  • **一律去掉开头的零。**有些国家(如意大利)没有长途前缀。
  • **保留零又加上国家代码,**得到+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或号码查询。

资料来源

  1. Recommendation ITU-T E.164: The international public telecommunication numbering plan
  2. Dialling procedures (international prefix, national (trunk) prefix and national (significant) number), ITU Operational Bulletin No. 994, 15.XII.2011
  3. WhatsApp user phone number formats — WhatsApp Business Platform, Meta for Developers
  4. Keeping leading zeros and large numbers — Microsoft Support
  5. libphonenumber — Google, open-source library on GitHub