01 / 从检查全文到检查变化
配置上线、接口报文和源代码审查面对的往往不是一份全新内容,而是“大部分没变,少数地方改变”。逐字通读两份文件容易漏掉一个端口、一个否定词或一行权限配置。差异工具把注意力集中到增删和相邻上下文,减少重复阅读,但不会替人判断变更是否正确。
Unix 的 diff 将文本差异变成可保存、交换的表示,后来补丁和版本控制进一步利用这种形式。行是源码与配置中自然的组织单位,因此行级比较很实用;报文或压缩 JSON 若只有一条长行,就更需要字符级或结构级的补充,而不是假装行级方法能理解字段意义。
本页并排显示旧值和新值,替换会计为删除旧行与新增新行。相邻增删行按顺序对齐以便阅读,不保证每一对都是语义对应。重复行和代码移动可能使最短差异存在多种合理路径;一个 diff 是解释变化的方案,不是唯一的修改历史。
02 / 找到较小的改动,也要控制计算成本
差异算法常把问题表述为寻找公共子序列或较短的编辑脚本:哪些单位可以保留,哪些需要插入或删除。Myers 在 1986 年发表的 O(ND) 差异算法,将工作量与序列规模和编辑距离联系起来,适合许多“大部分相同”的实际文本;完全不同、重复很多或特别长的输入仍可能昂贵。
本页使用成熟的 jsdiff 引擎,在 Worker 中运行行级比较;有输入、编辑距离和时间预算限制。无法在预算内完成会明确提示,不给不完整结果。行内高亮以扩展字素簇分段,避免拆开组合重音和 emoji;超长或复杂行只给整行差异,保留原文,不强求逐字符分析。
行内高亮展示对齐行的原始字符差异,忽略规则影响行匹配与增删统计。字素簇更接近用户看到的字符,但不等于字体字形或语义单位;视觉相似的 Unicode 字符依然可能不同,本页不做大小写折叠、字符规范化或自动格式化。
03 / 文本相同、字节相同、语义相同
相同文字可以用 UTF-8 或 GBK 存成不同字节;不同 JSON 文本也可能表示相同对象。缩进变化在部分格式里只是呈现,在 Python、YAML 等环境中却可能影响语义。SQL 中一个空格是否可忽略也取决于位置,不能把“忽略空白后相同”当成“程序行为相同”。
CRLF 与 LF、末尾是否有换行、开头 BOM 都可能影响文件摘要、脚本或协议。本页默认保留这些差异;忽略规则必须明确开启,而且“按规则无差异”仍会注明原文是否不同。忽略空格仅针对 ASCII 空格与 Tab,不删除空行,不吞掉不换行空格等 Unicode 字符。
文件导入保留 UTF-8 BOM 和原始换行在内存中的字符表示,不改写原文件。编辑框会按浏览器行为使用 LF,用户实际编辑后以编辑内容为准;左右交换和差异下载则使用完整内存原文。需要确认源编码时,先到字符编码与乱码检查,不能先把乱码当正常文字比较。
上线检查:差异是证据,不是结论
先确定左右两份材料的来源、版本和编码,再确认比较规则。查看变更行,也查看上下文:同一句配置处于不同作用域,意义可能完全不同。“只是换行”对签名字节可能很重要,“只改了一个数字”对端口或金额也可能是核心变化。
本页只比较文本,不解析 JSON/XML/SQL 的语义,不执行脚本,不提供合并或补丁应用。文件仅接受严格 UTF-8,其他编码先显式转码;每侧文件最多 256 KiB,文字最多 65536 个 UTF-16 单元、2000 行。计算可能因差异规模或时间预算提前拒绝。
差异 JSON 包含完整左右行内容、行号、换行、比较规则及高亮结果,不是可直接应用的补丁。默认不上传、不保存任何输入,只保存站点主题偏好;下载的差异也可能含凭证、配置或个人信息,应按原文同样保管。