电话号码需处理区号与格式变体
别名: 电话格式 · 国际区号 · E.164 · phone input
概念解释
电话号码在人手里是一串带空格、横线、括号、前导 0 和 + 的写法,在系统里通常要落到可拨打的单一表示。处理区号与格式变体指输入层要同时接受本地写法(010-6552-xxxx、(415) 555-…)和国际写法(+86 …、00 44 …),并把国家码与国内号码分开存储,而不是用一条「11 位数字」卡住所有人。地址怎么分列、姓名有几段,不是电话的问题。展示时要不要分组,也不等于输入时只能键入无空格数字。
机制
人按自己听过或抄过的格式回忆号码,不会先把它洗成规范数字。校验若只认一种长度或禁止 + 和空格,合法号码在输入层就死了。第二层是国家码与国内前缀的冲突:中国国内写 010,国际写 +86 10;英国国内写 020,国际写 +44 20。两套前缀不能同时出现在同一规范值里,但输入必须允许人写其中任一套。没有国家选择器时,+ 是唯一稳定的国际线索;强制「先选国旗再填本地号」对只记得国际格式的人不友好,反过来只给一个无国界的数字框,又无法解释前导 0。分三个框(国家码、区号、号码)在区号已经取消的国家会变成空壳。稳妥的输入是:可含标点的一串 + 明确的国家上下文,存储时再归一。
怎么研究
让人用自己手机上「联系人里怎么存的」那串去填,而不是用实验者印好的数字。比较「纯数字长度校验」、带国家选择器、允许 + 与空格再解析。
自变量:是否允许标点和 +、国家码如何提供(选择器 / 从 + 解析 / 假定当前国)、是否剥国内前导 0。
因变量:本人号码被拒、国际与本地两种写法是否都能通过、归一后能否拨通或发短信、人是否把国家码填进号码框导致重复。
实验室给打印好的 11 位,会假装长度校验够用。要用通讯录粘贴。短信验证码能否真正到达是比格式是否好看更硬的因变量。
边界
只在一国运营且运营商保证长度唯一的内部分机表,可以用固定长度,但仍应接受粘贴进来的空格。分机号(;1234、ext. 12)不是国家码,混进同一框会破坏归一。紧急号码、短码、服务号长度远小于普通号码,用手机号规则会把它们判死。语音输入会带「加号八六」之类的词,需要另一套解析,不能只靠按键过滤。
怎么落地
- 电话输入允许空格、横线、括号和前导
+;校验在剥离标点之后做,不要在按键时禁止这些字符。 - 国家上下文必须明确:选择器或从
+解析,禁止默认「都是本国 11 位」。国内前导 0 在归一到国际表示时丢掉,不要让用户自己决定丢不丢。 - 粘贴来自通讯录的整串应一次解析成功,不要要求人先删空格。
- 验证:把通讯录里带括号的美国号码、带
+86的中国号码、带国内前导 0 的同一号各贴一次,三次都应归一到可拨打的值。用「必须 11 位数字」去挡带空格的本国号,作为不得发布的对照。发一条验证码到归一后的号,确认不是只通过了格式。