摘要

  • RFC 3601 的 phone-string 不只是号码表示。它可以组合 DTMF 元素、暂停、等待拨号音和视觉分隔符;本地形式还能带取外线码、运营商接入码、服务密码与接通后的菜单输入。
  • 治理必须分别保留来源、类型、上下文、授权、设备动作、信令、连接与业务结果。上一步的成功不能替下一步作证。

同一串字符放在甲办公室可以拨通,放在乙办公室却可能先进入另一条外线、把密码送错地方,或者永远等不到设备认可的拨号音。数据库会说两条记录完全相同,用户却面对两种行为。差异不在字符串,而在执行它的系统。

RFC 3601 于 2003 年 9 月以 Standards Track 发布,目标是为拨号序列以及可拨打的 GSTN/E.164 地址提供统一文本表示。它把 Dial Sequence 定义为 DTMF 元素与人或设备动作组成的序列。对应的 phone-string 可以包含数字、#、*、A-D、表示暂停的 p、表示等待音的 w,以及连字符和点号两种书写分隔符。

这些字符并不处在同一层。连字符和点号只改善可读性,不得触发动作;实现可以插入或删除它们。p 和 w 则会改变执行流程。去掉视觉分隔符可以是等价规范化,去掉所有非数字字符却可能删除等待和暂停,把一条程序改写成另一条程序。

动作本身也没有唯一时间语义。RFC 3601 建议把一次暂停解释为一秒,建议 tonewait 等到拨号音或其他允许继续处理字符的信号;摘机指示也可能被当作这种信号。但文档明确说,精确含义取决于具体设备与实现。同一个 w 在两种拨号器上可以由不同观测解除。

因此,语法通过只能证明字符排列符合语法。它不能证明设备发出了每一个 DTMF,不能证明暂停实际持续多久,也不能证明等待因何结束。一条“tonewait 已满足”的日志,只能说明本地检测器做出了判断;它没有证明远端是谁、呼叫是否建立,或者后续数字是否到达预期服务。

RFC 3601 还区分全局形式和本地形式。global-phone 以 + 开头,表示可拨打的 E.164 数字地址。加号被严格保留给这种语法。然而文档同时指出,完整的抽象 E.164 地址还包含无法拨打的元素,不能被完整转换为拨号序列。加号守住了命名空间,却没有把所有抽象地址属性压缩进一串可执行数字。

local-phone 的语境依赖更强。它可以由 exit-code 与 dial-number 构成。exit-code 可能包括取外线的数字、长途运营商接入码、服务访问密码等内容。迁移工具若只复制字符而不复制 PBX、站点、国家编号计划、运营商规则和配置版本,保留的只是表面。

后来的 RFC 3966 把边界讲得更明确:tel URI 是电话号码的标识符或名称,不描述到达它的具体步骤,也不承诺从任何地方都可达。拨号字符串、暂停和 post-dial 被排除在它的范围之外。本地号码必须带 phone-context,但这个上下文表示有效范围,并不是可以直接拼到本地号码前面、保证生成 E.164 的前缀。

RFC 4967 随后为 SIP/SIPS 定义了 user=dialstring。它要求拨号字符串总有上下文,而且必须与“恰好使用同样字符的用户部分”区分开。RFC 6116 在 ENUM 中也坚持类似边界:输入是带 + 的完整 E.164 号码,而不是某个地点实际按下的本地拨号数字。同一个全局号码在不同地方可能对应不同拨号序列。

这意味着“电话号码字段统一转成 tel URI”不是纯格式工程。若旧值含取外线、暂停、等待或接通后输入,添加一个方案名可能丢掉动作,也可能把动作伪装成身份。正确顺序是先分类:标识符、global-phone、local-phone、Dial Sequence、子地址或 post-dial;再决定拆分、保存还是拒绝。

post-dial 自带一个前置条件。RFC 3601 用它表示与目标设备建立连接之后,为进入自动菜单等服务而继续发送的序列。数据库中存在 post-dial 字段,并不证明连接已经建立。执行记录必须先关联应答或会话建立回执,再记录后续 DTMF 及服务反馈。

同一字段还可能保存秘密。RFC 的示例把语音信箱用户 ID 与 PIN 放进序列;安全部分警告,未经保护地传输这种文本会泄露私人代码。一个被当作联系人信息的值,可能同时是可执行程序和凭证容器。

泄露往往不是从拨号器开始。搜索索引、CRM 导出、分析仓库、故障日志与客服截图都会复制“电话号码”,因为标签看起来无害。若全部遮掉,事后无法关联;若原样保留,密码扩散。更好的结构是分别保存公共地址、动作计划和受保护的秘密引用;日志保留稳定哈希、结构与事件,不保留明文 PIN。

证据链要逐层展开。第一层记录提供者、原始字段类型、原值哈希与时间。第二层记录分类和解析器版本。第三层记录站点、PBX、编号计划、运营商策略与配置纪元。第四层逐字符记录规范化。第五层是执行授权。随后,每一个 DTMF、暂停时长和等待解除条件都有动作回执。路由、连接、post-dial 与业务结果各自使用独立标识和时间。

这样才能避免状态压缩。“已导入”不等于“已分类”,“合法”不等于“获准执行”,“已拨号”不等于“已连接”,“已应答”不等于“目标身份正确”,“已发送按键”不等于“菜单接受”。证据严谨并不是默认失败,而是让每条回执只陈述自己真正观察到的事实。