
国际电话号码标准
不同国家的电话号码在长度、格式和路由上差异巨大。E.164标准(ITU-T建议)为全球电信系统中使用的国际电话号码提供了通用格式。

E.164格式
E.164国际电话号码格式:
+[国家代码][区号][用户号码]
要求:
- 以
+(国际前缀)开头 - 最多15位数字(不包括
+) - 无空格、破折号或括号
示例:
- 美国号码:
+12125551234(国家代码1,区号212) - 英国号码:
+442071234567(国家代码44) - 日本号码:
+81312345678(国家代码81)
E.164被SMS网关、VoIP系统、CRM平台以及Twilio等电话API使用。
国内格式与国际格式
同一个号码在国内格式和国际格式下可能看起来截然不同:
| 国家 | 国内格式 | 国际格式(E.164) |
|---|---|---|
| 美国 | (800) 555-0100 | +18005550100 |
| 英国 | 020 7946 0958 | +442079460958 |
| 德国 | 030 12345678 | +493012345678 |
| 法国 | 01 23 45 67 89 | +33123456789 |
| 澳大利亚 | (02) 1234 5678 | +61212345678 |
| 日本 | 03-1234-5678 | +81312345678 |
注意:国内格式通常省略国家代码,并使用本地区号表示法,带有各种分隔符。
国家代码参考
常见国际拨号代码(国家呼叫代码):
- +1:美国、加拿大和加勒比国家
- +7:俄罗斯和哈萨克斯坦
- +20:埃及
- +27:南非
- +33:法国
- +34:西班牙
- +44:英国
- +49:德国
- +55:巴西
- +61:澳大利亚
- +81:日本
- +82:韩国
- +86:中国
- +91:印度
- +971:阿拉伯联合酋长国

电话号码验证
验证电话号码比看起来更复杂:
基本格式验证
// 简单的E.164格式正则表达式
const e164Regex = /^\+[1-9]\d{1,14}$/;
e164Regex.test('+12125551234'); // true
libphonenumber
Google的libphonenumber库提供了基于国家特定规则的全面验证:
// 使用libphonenumber-js
import { parsePhoneNumber } from 'libphonenumber-js';
const phone = parsePhoneNumber('+12125551234');
phone.isValid(); // true
phone.country; // 'US'
phone.formatInternational(); // '+1 212 555 1234'
phone.formatNational(); // '(212) 555-1234'
libphonenumber了解每个国家的有效号码模式,不仅验证格式,还验证特定号码是否可能存在。

电话号码类型
- 地理号码:与位置关联的固定线路号码
- 移动号码:手机号码
- 免费号码:美国的800/888/877;免费拨打
- 付费号码:收入分成号码
- VoIP号码:基于互联网的电话号码
- 短号码:用于SMS服务的5-6位数字号码
类型影响验证规则和预期长度。
在数据库中存储电话号码
最佳实践:
- 始终以E.164格式存储:规范、无歧义、可搜索
- 存储为VARCHAR/TEXT:不要存储为整数(前导零、+号)
- 单独存储原始输入:如果需要按输入显示
- 输入时规范化:在注册时验证并转换为E.164
-- 好:E.164存储为文本
CREATE TABLE contacts (
id SERIAL PRIMARY KEY,
phone_e164 VARCHAR(16), -- +12125551234
phone_display VARCHAR(30) -- (212) 555-1234
);
使用电话号码解析器和格式化器
我们的工具:
- 解析任何电话号码格式——处理括号、破折号、空格、点号
- 检测国家——通过呼叫代码识别国家
- 验证号码——根据国家特定规则检查
- 转换格式——以E.164、国际或国内格式显示
- 显示号码类型——地理、移动、免费等
- 批量处理——从CSV一次解析多个号码
用于在数据库导入前标准化电话号码、验证用户输入以及重新格式化联系人列表。