摘要

  • RIPE Database 1.123 在 descr: 与 remarks: 的 UTF-8 处理路径中对分解形式的 Unicode 使用 NFC,位置在控制字符清理与 IDNA 转换之前。
  • 规范化有助于互操作,但提交的码点序列、数据库中的规范表示,以及某一接口实际输出的字节,仍然是三个不同的证据对象。
  • 一张不公开自由文本、凭证或个人数据的处理凭据,可以把三层表示重新连起来。

姓名没有变,码点已经变了

RIPE NCC 在公开测试里用了一个具体姓名:Ondřej Caletka。其中的 ř 可以直接写成预组合字符 U+0159;也可以先写普通的 r,即 U+0072,再跟上组合用的 caron U+030C。正确渲染时,两种序列应当呈现为同一个抽象字符;若直接比较二进制,它们并不相同。

这不是根据界面效果作出的猜测。Whois 1.123 所含的公开源码补丁新增了 ICU 的 NFC 规范化器。createUtf8Attribute 先解除 Java 转义,再执行 NFC,然后遍历结果中的码点,清理控制字符,最后进行原有的 IDNA 转换。测试把 U+0072 U+030C 放入 descr: 属性,要求结果的 Java 字符串长度为一;它还要求分解写法的 Ondřej Caletka 变成含单一码点 ř 的 Ondřej Caletka。

因此,NFC 不是浏览器替文本“美化”一下,而是进入了属性值的转换链。RIPE 的发布说明把 1.123 的正式部署日期列为 2026 年 7 月 8 日,并把范围写得很窄:在 descr: 或 remarks: 中规范化分解形式的 Unicode。现行 Character Encoding 文档也说明,这两个自由文本属性接受 UTF-8,并以 NFC 进行规范化。

先承认 NFC 的价值

Unicode 标准附录第 15 号把 NFC 定义为“规范分解后再规范组合”。它要解决的核心问题,是让规范等价的字符串得到同一个规范结果。一个键盘把重音符作为组合符输入,另一个编辑器直接输入预组合字符,两者不应因此永久成为两个无法稳定交换的文本值。

所以,把 RIPE 的选择描述成篡改并不准确。NFC 保持规范等价,也不同于会折叠更多表现差异的兼容性规范化。对一个同时服务数据库、API、镜像和历史客户端的注册系统而言,减少等价文本的二进制分叉是一项防御措施。

RIPE NCC 对实施范围也采取了克制。此前的 1.122 于 2026 年 4 月 30 日进入生产,只向 descr: 和 remarks: 开放 UTF-8。工作组提案把它称为最小可行改动:让运营者能够添加本地语言的说明,同时积累经验,不触碰姓名、地址或个人数据字段。提案还明确警告,不应在这两个自由文本属性里放个人数据。

真正需要追问的,不是注册系统为什么没有保存两套等价的主值,而是它能否说明一次提交经过了什么转换,以及后来看到的输出属于哪一层。

同一个对象,会从不同接口得到不同表示

RIPE 的编码文档把接口分成了两组。Whois 43 端口、NRTMv3 和普通的每日 .gz dump 默认使用 Latin-1;某个字符若无法由接口表示,文档说会替换为 ?。数据库网页、Whois REST API、RDAP、NRTMv4、Syncupdates 与 .utf8.gz 文件默认使用 UTF-8。43 端口客户端还可通过字符集参数改变返回编码。

这种并存有现实原因。旧客户端需要连续性,UTF-8 接口则应保留规范字符。但从 Latin-1 流中保存下来的对象,并不因为来源同为 RIPE Database,就与规范 UTF-8 对象构成字节级同一份证据。接口补出的问号也不等于提交者亲手写下的问号。

差异会进入日常操作。镜像可能对收到的流计算哈希;网络团队会保存更新确认;审计人员会拿旧 dump 对照 REST 响应。如果哈希没有注明表示层,编码变化可能被误读为内容变化。反过来,只看屏幕上的姓名,两次不同的原始输入又可能因为 NFC 而显得从未有差异。

公开资料没有证明某个具体镜像犯过这种错误,也没有说明 1.123 上线时是否批量规范化了所有旧对象,或 RIPE NCC 是否在内部保存每一次规范化前的输入。文章不需要填补这些未知。已经足够确定的是:系统会做有意的表示转换,而证据必须说明自己绑定在转换前还是转换后。

凭据应当薄,转换链可以很厚

更新侧的凭据可以记录对象与版本、操作确认、属性类型、入口接口和输入字符集。它应标出 NFC、软件版本或 commit,说明码点序列是否发生变化,并按原因类别记录控制字符或无效码点替换。它不必收录 descr: 或 remarks: 的内容。

完整性绑定也需要隐私判断。短小且可预测的文本,即使只公布裸哈希,也可能被枚举猜出。可以使用受访问控制的批次哈希、带密钥的承诺,或只向有权核验的当事方提供的证明。公开凭据没有理由泄露更新凭证、自由文本或个人数据。

输出侧再加入查询或复制接口、请求的字符集、序列化版本和实际输出对象的摘要。后续修改通过替代关系连接。这样,一条链上会有三个可以点名的状态:提交值、规范值和输出值。

这张凭据也不证明自由文本所说的事实。经过 NFC 的 remarks: 不会因此证明谁在运营网络,descr: 也不会因此成为资源所有权或实时路由状态。凭据只证明两种表示之间用了什么规则。把证明范围缩小,恰恰让它更可靠。

这篇文章不作哪些推断

现有来源没有显示 NFC 导致事故、攻击、授权失败、身份错认或用户损害;没有显示所有 RPSL 属性都支持 UTF-8;也没有显示 person:、role:、org-name: 或地址字段已随之国际化。单独一个源码补丁更不能回答每个历史对象的处理方式。

2026 年 8 月的 NRTM 事故属于另一条机制:多余换行、无效 RPSL 对象、镜像流停止,以及 1.124 的后续改动。它不在本文范围内。复制连续性的凭据与 Unicode 表示的凭据不能互相替代。

来源

  1. RIPE Database 发布说明
  2. RIPE Database 字符编码文档
  3. RIPE Database 历年季度计划
  4. RIPE 90 数据库工作组运营更新
  5. 关于在 descr: 与 remarks: 使用 UTF-8 的工作组提案
  6. Whois 1.122 发布邮件
  7. RIPE Labs:RIPE Database 使用 UTF-8 的影响分析
  8. RIPE-NCC:规范化分解 Unicode 的源码 commit
  9. RIPE-NCC Whois releases
  10. Unicode 标准附录第 15 号