Skip to content

国家与格式 ​

格式从哪里来 ​

国家表由 libphonenumber 的元数据生成 —— 这是 Android 用来校验号码的 Google 库。对每个国家,取一个手机号码示例及其不带前缀的国内格式:也就是该国本地书写号码的方式。

tinyval-mask 中的 28 个国家保留其原有格式 —— +7 (999) 999-99-99,而不是 +7 999 999-99-99:从 tinyval-mask 切换到 tinyval-phone 不会有任何变化。

Google 库不会进入打包文件:包中只有现成的表 —— 区号、模板和几个正则表达式。

ts
import { phoneTable } from 'tinyval-phone';

phoneTable.jp; // ['81', '99-9999-9999', '0']
phoneTable.bs; // ['1', '(999) 999-9999', '1', '242']
//               код, шаблон после кода, национальная приставка, признак страны

长度不同的号码 ​

在一些国家,号码长度不固定:德国手机号为 10 或 11 位,奥地利为 8 到 13 位。模板中多出的数字是可选的:+49 999 9999999[9]。输入达到最小长度时,号码即视为已填写(complete)—— 之后还可以继续输入数字。

共用区号的国家 ​

一个电话区号可能属于多个国家:+1 是美国、加拿大以及另外 23 个国家和地区(巴哈马、牙买加、波多黎各……),+7 是俄罗斯和哈萨克斯坦,+44 是英国、泽西岛、根西岛和马恩岛。国家按以下方式识别:

  1. 取最长的匹配区号:+1242… —— 区号 1,+375… —— 区号 375。
  2. 如果某个国家有“特征”且号码与之匹配 —— 就是这个国家。特征可以是号码开头(+1 242 —— 巴哈马),也可以是整个号码(+1 416 555 0123 —— 加拿大:在号码输入完整后按地区代码识别)。
  3. 否则 —— 该区号的主要国家:+1 是美国,+44 是英国。

在加拿大号码输入完整之前显示的是美国 —— 掩码相同,只是国旗不同。奥兰群岛、梵蒂冈、斯瓦尔巴、科科斯群岛等少数地区的号码无法与芬兰、意大利、挪威和澳大利亚的号码区分 —— 对它们识别为主要国家,libphonenumber 也是这样处理的。

ts
detectCountry('+1 201 555 0123'); // 'us'
detectCountry('+1 242 359 1234'); // 'bs'
detectCountry('+1 416 555 0123'); // 'ca'
detectCountry('+7 701 123 4567'); // 'kz'
detectCountry('+44 7797 712345'); // 'je'

国内长途前缀 ​

在国内拨号时,号码前常常要加前缀:俄罗斯是 8,英国和德国是 0,匈牙利是 06。设置 defaultCountry 后可以输入它 —— 前缀会被去掉,国家代码会自动加上:

ts
mask('07400123456', phoneAuto({ defaultCountry: 'gb' })); // '+44 7400 123456'
mask('015123456789', phone('de'));                       // '+49 151 23456789'
mask('0612345678', phone('fr'));                         // '+33 6 12 34 56 78'

自定义国家和格式 ​

可以修改国家的格式,添加或删除国家:npx tinyval-phone countries 把国家表复制到项目中,setCountries 加载它。详见 自定义国家和国旗。

ts
import { setCountries } from 'tinyval-phone';

setCountries({ de: ['49', '9999 9999999[9]', '0'], xk: null });

更新数据 ​

各国的号码规划有时会变化。可以通过 npm run generate -w packages/tinyval-phone 从最新的 libphonenumber-js 和 country-flag-icons 重新生成国家表和国旗;测试会检查每个国家的示例号码。