摘要

  • RFC 1456 按预组字符方案计算,越南语在 ASCII 现有字母之外还需 134 种组合;VISCII 保留全部可打印 ASCII,却让六个较少使用的大写字母占用六个 C0 控制码位置。
  • VIQR 面对的是另一道约束:它用形似附加符号的 ASCII 标点表达越南语,使文本能穿过七位邮件与新闻系统,但也把上下文和转义状态带进了文字含义。
  • MIME 字符集标签能够指示解码语法,却不能证明字节正确、软件支持、字体完整、转换可逆,更不能证明读者看到并理解了发送者所写的内容。

134 不是抽象的容量数字

越南语使用拉丁字母,容易让只看基本字形的人误以为现成 ASCII 稍作扩展就够了。RFC 1456 指出,除 ASCII 已有字母之外,还要处理 134 种字母与附加符号组合,而且这些组合使用频繁。它们不是偶尔插入的装饰,而是日常拼写的一部分。

如果把一个字母拆成基本字母与若干组合符号,理论上可以减少编码位置。但文档的作者认为,当时多数平台并不能可靠地把这种组合方案融入现有应用。频繁要求用户先按特殊组合键,也会把语言成本推给每次输入。

VISCII 因而选择把每个越南语字母编码为一个单位。旧式程序更容易把它当成一个字符存储、移动和显示,代价则落在有限的 8 位空间里。

设计者优先保留了完整的 ASCII 可打印字符集。已有软件依赖的英文字母、数字、标点和符号不挪位置。为装下最后六个较少使用的大写越南语字母,VISCII 使用了六个被认为“问题最少”的 C0 控制位置。

于是同一个低位字节具有两种互不兼容的主张。按 ASCII 语法,它是控制功能;按 VISCII 语法,它是字母。字节没有改变,变化的是解释它的字符表。

“问题最少”并不等于没有问题

控制码并非只存在于纸面标准里。终端驱动、过滤器、串行链路与网关可能在字符集解码之前就消费低位值。某条路径可以完整保存一个 VISCII 字母,另一条路径却可能把同一字节当成控制动作丢掉,第三条路径还可能用错误代码表把它变成别的字符。

RFC 1456 没有把这种复用包装成天然等价。它是在当时软件约束下做出明确取舍:保留可打印 ASCII,换取 Unix、个人电脑、邮件、新闻、打印与数据库等既有工具的兼容入口;风险则集中到六个控制位置。

这也说明安装基础如何产生事实上的治理。旧软件没有发布命令,却通过文件格式、终端行为、字体和解析器决定了新语言最便宜的进入方式。越南语社群没有等所有基础设施先完成理想升级,而是让能运行的软件先形成桥梁。

文档报告 VISCII 与 VIQR 已在 Unix、MS-DOS 和 Windows 等环境实现,并提到 Plan 9 的 tcs 转换支持。这些是 1993 年作者所记录的运行事实,不是覆盖所有用户、所有版本和所有往返转换的统计证明。

七位链路需要另一种折中

VISCII 解决 8 位环境,邮件与新闻中的七位限制仍在。VIQR 为此保留纯 ASCII 传输表面。RFC 1456 特意称它为输入、阅读与传输约定,而没有把它和 VISCII 当成同一种编码形式。

VIQR 选择容易联想到附加符号的可打印字符。左括号表示短音符,脱字符表示扬抑符,加号表示角形符;撇号、反引号、问号、波浪号和句点表示声调;重复的 dd 或 DD 表示带横的 D。

这套方案的重要优点不是机器内部更简洁,而是中间系统即使不认识越南语,用户仍可能读出助记形式。七位环境显示 ASCII 序列;八位环境可以用同样按键经软件转换后显示越南语字形。两边共享的是输入动作,不是屏幕上的像素。

但标点本来就有自己的意义。问号可能表示疑问,也可能在合适位置被解析为字母声调。RFC 1456 用普通英文句子 “How are you?” 举例:如果没有防止错误组合的规则,句末问号可能被吞进前面的字符结构。文档说明 VIQR 具有避免这种组合的办法,却把完整转义细节留给另一份框架文件。

因此,一个问号并不天然是声调符号。只有当 VIQR 语法、位置和转义状态共同允许时,它才获得那层含义。人可以勉强读懂助记文本,并不表示解析器已经退出现场。

标签只负责指路

RFC 1456 把 VISCII 与 VIQR 放进 MIME 的命名框架:相应正文应使用正确的字符集值,支持这两种字符集却不是 MIME 合规软件的强制要求。

标签表达发送方希望接收方采用哪种解释。它不会检查正文。标有 VISCII 的邮件可能已经丢失低位字节;软件可能认识名字却没有转换表;转换器可能采用不同版本;正确码点也可能因为字体缺失而显示为空框。

后来的 MIME 规则把界面说得更清楚:纯文本在缺少字符集参数时默认按 US-ASCII 解释,并强烈建议明确标注。VISCII 一旦丢失标签,六个字母可能在抵达读者之前重新变成控制码。VIQR 丢失标签时也许仍能肉眼辨认,却可能在搜索、排序和往返转换中悄悄改变。

IANA 当前字符集登记仍保存 VISCII 与 VIQR 两个名称,MIBenum 分别为 2082 和 2083,别名为 csVISCII 与 csVIQR。这证明标识符仍有稳定记录,不证明今天的使用量、软件覆盖率或解码正确率。

UTF-8 改变了抽屉的形状

后来的 UTF-8 提供另一种分配方式:全部 US-ASCII 字节原位保留,其他文字则使用变长序列进入更大的通用字符空间。问题不再是如何把世界文字全部塞进 256 个位置,六个 C0 控制值也无需继续兼任越南语字母。

新的通用方案不会自动修复旧档案。VISCII 文件必须先按原表解码,再编码为 UTF-8;VIQR 文本也必须先执行它的上下文语法。把旧字节直接交给默认 UTF-8 解码器,只是换了错误的解释权。

屏幕看起来正确仍不等于转换完全。Unicode 自身也存在规范化与比较问题。相同视觉结果可能对应不同码点序列,影响搜索、签名与标识符匹配。通用字符集扩大了共同空间,却没有消灭解释边界。

从语言到读者的证据链

RFC 1456 让一条容易被界面隐藏的链条显形:

语言字符 → 选定表示法 → 字节或 ASCII 序列 → 字符集标签 → 解码器状态 → 码点 → 字形 → 人的阅读

每一步都有不同控制者。语言使用者决定哪些区别不可丢失;约定分配表示;发送方产生字节与标签;传输系统保存或改变它们;解码器执行字符表和转义状态;字体绘制字形;读者理解结果。

任何较早记录都不能代替后续事实。校验和通过,可以与字符集标签错误同时发生;标签有效,可以与软件不支持同时发生;截图可读,可以来自替换字符或不可逆转换;两个名字肉眼相同,也可能因为码点序列不同而无法精确匹配。

来源与边界

发布状态来自 RFC 1456 信息页。134 种组合、VISCII 位置分配、VIQR 语法、软件报告与安全事项边界来自 RFC 1456 正文。同期内容类型框架来自 RFC 1341,后来的明确字符集规则来自 RFC 2046。更大字符空间的对照来自 RFC 3629。标识符延续来自 IANA 字符集登记。符号记录与运行结果的分层解释,公开依据是 Lu Heng 的运行代码优先与现实层论述。

这些来源不支持普遍采用率、当代流量、无损转换、某个档案事故或 VISCII、VIQR 与 UTF-8 之间的直接因果迁移。RFC 1456 明言未讨论安全问题。一次成功解码只能证明某种解释产生了结果,不能认证发送者,也不能证明读者理解了原意。