摘要

  • RFC 3987 把国际化标识符定义为 Unicode 字符序列,同时保留了与既有 URI 软件之间的确定映射。
  • 可输入、可显示、可传输、可比较和可访问是五项独立能力,任何一项成功都不能替其余项目作证。

2005 年 1 月的 RFC 3987 并没有把 URI 的字符范围直接扩张。它的状态记录、勘误与 Datatracker 历史保留了更谨慎的设计:另建一个 IRI 协议元素,以 Unicode 字符序列表示标识符,再定义到 URI 的确定映射。新入口与旧软件由此可以协作,但两种表示并未被宣布为同一份证据。

这一区分决定了国际化不能只做前端演示。输入法交付的是字符;应用把字符放进 UTF-8 或 UTF-16;容器可能再次转义;旧协议需要百分号编码的 URI;主机名可能进入 IDNA;缓存生成比较键;DNS 返回名字结果;应用最后才产生页面或服务结果。把其中一个绿色状态命名为“IRI 支持”会掩盖真正的断点。

RFC 3986及其状态、勘误和历史已经说明,URI 比较要服从具体目的。RFC 3987 又增加了字符与字节的差别。同一字符序列采用 UTF-8 与 UTF-16 时,字节必然不同;简单比较必须先变换到共同字符编码,再逐码点比较。

标准随后明确禁止一个看似省事的做法:逐字符比较之前不得先把 IRI 映射为 URI,因为这种映射会制造额外的虚假等价。传输转换可以是确定的,却不因此成为通用身份函数。只要一个 IRI 可能作为标识符,运输过程中就不应悄悄改写它。

规范化也不是全局开关。纸面或已知非 Unicode 编码进入转换时,需要用 NFC 形成 Unicode 字符序列;已经采用 UTF-8 或 UTF-16 的输入则不在该步骤重新规范化。创建者应尽量用 NFC,但第三方不知道资源所有者如何处理字符序列时,不应任意规范化既有 IRI。

RFC 5198及其状态、勘误和记录解释了 NFC 为什么能减少网络文本的组合形式差异,也说明已分配字符的 NFC 稳定性预期。它支持在创建与交换环节采用一致形式,但没有把中间人的便利升级成改写标识符的权力。

百分号编码最能显示“本地比较”的边界。应用为了判断一种具体等价,可以对齐十六进制大小写,或把相应形式转换后消除转义差异。但 RFC 3987 要求:如果值还会交给别的应用或继续使用,就必须保留原始形式。比较键可以是索引,不能成为唯一原件。

字符串比较的结论同样有限。规则可以证明某两种字符串表示在该目的下等价,却不能因字符串不同就证明资源不同;同一所有者完全可以让多个标识符指向同一资源。成功取回内容也不倒推出名称注册、传输保真或访问授权。

主机名部分还要经过后来的 IDNA2008 边界。RFC 5890及其状态、勘误和历史区分可读的 U-label、ASCII 的 A-label、注册与查询。RFC 5891的状态、勘误和历史规定验证与对称条件。界面显示出一个国际化标签,并不等于 DNS 已接受、注册者有权或解析已经成功。

RFC 5895及其状态、勘误和记录把用户界面映射与协议处理分开。大小写、全角半角、中文输入、语音和粘贴可能需要不同策略;文档甚至明确拒绝把示例步骤当成普适算法。

RFC 3987 的上线顺序因此十分现实:只有目标服务已经接受 IRI,而且中间基础设施与协议被确认能安全传送时,生成端才应开始发出 IRI;把 URI 转成 IRI 供显示,也应等输入软件在目标人群中充分部署。国际化不是一次格式切换,而是一条分段迁移链。

正确的验收表要分别记录原始字符、Unicode 版本与 NFC 状态、字节编码、容器转义、URI 映射、比较目的、scheme 规则、IDNA 验证、DNS 回答和应用结果。可读性解决了人能否使用自己的文字;原始形式的保留,解决的是多年以后系统还能否说明自己究竟比较和传输了什么。

来源