如何对比两段文本
- 把旧版本粘贴到左边的原始文本,把新版本粘贴到右边的修改后的文本。
- 选择按行或按单词对比。停止输入片刻后会自动对比,点击对比则立即执行。
- 先看摘要,例如新增 2 行,删除 1 行,再浏览高亮显示的结果。如果没有差异,会显示未发现差异。
如何看结果
行模式的结果以表格显示。第一列数字是原始文本的行号,第二列是修改后文本的行号;符号列中,删除的行(红色)标为 −,新增的行(绿色)标为 +。未改动的行会同时显示两个行号。按行来看,一次修改就是“删除 + 新增”的组合,所以改过的行会显示为一条删除的行,紧接着一条新增的行。
单词模式会把修改后的文本按原文样式显示出来,删除的词以红色删除线标出,新增的词以绿色标出,都显示在原来的位置上。文本被切分为单词、单个标点符号和连续的空白。只有空白发生变化的地方会被高亮,但不计入摘要的数量。
按行还是按单词?
- 行适合源代码、配置文件、CSV 数据、列表等每一行都是一个意义单位的文本。
- 单词适合合同、论文、文章、审校中的译文等普通文字。长段落本身就是一行,在行模式下哪怕只改了一个词,整段也会被标为已修改。
忽略大小写和忽略空白
忽略大小写会把“Hello World”和“hello world”视为相同。忽略空白在两种模式下的作用略有不同。行模式会在比较前删除两行中的所有空白,因此缩进、行尾空格和行内空格的差异都会被忽略,连 ab 和 a b 也被视为相同。单词模式会把任意连续的空格、制表符和换行都视为相同,所以只是换行位置不同的文本会显示为没有变化。
示例
配置文件的改动。原始文本是 host=localhost、port=8080、debug=true 三行,修改后把端口改成了 9090,并在末尾加了 timeout=30。行模式会显示删除第 2 行、新增第 2 行和新增第 4 行,摘要为新增 2 行,删除 1 行。
英文句子的修改。用单词模式对比“The quick brown fox jumps over the lazy dog.”和“The quick red fox leaped over the lazy dog.”,会高亮 brown → red 和 jumps → leaped,结果为新增 2 个单词、删除 2 个单词。在行模式下,同样的内容只是删除一行、新增一行。
中文句子。中文的词与词之间没有空格,单词模式会把两个标点之间的整段文字当作一个“单词”。对比“我昨天在北京见了朋友。”和“我昨天在上海见了朋友。”,虽然只改了两个字,显示的却是句号前的“我昨天在北京见了朋友”整体被替换。
只改了格式的代码。对比 if (x == 1) { 和 if (x==1) {,以及下一行缩进不同的代码,会显示两行被修改。勾选忽略空白后,结果就变成未发现差异。
对比的原理
本工具使用 Eugene W. Myers 于 1986 年发表的 Myers 差异算法,这也是 Git 默认使用的算法。它会找出把原始文本变成修改后文本的最短编辑脚本,也就是插入和删除行或单词次数最少的方案。工具会先匹配两段文本开头和结尾的相同部分,只对中间不同的部分进行完整搜索。如果这一部分需要超过 2,000 次插入和删除,为了不让浏览器卡住,工具会停止搜索,把整个中间部分显示为先删除、再新增。
结果是最短的编辑方案,而不是作者实际操作的记录,所以移动过的段落会显示为一处删除和另一处新增,不会单独标出“移动”。
让对比更清晰的技巧
- 对比两个 JSON 文件时,先用 JSON 格式化以相同的缩进、并开启键名按 A→Z 排序处理两边,格式和键的顺序就不会被当成改动。
- 对比两个顺序无关紧要的列表时,先用文本行排序把两边都排好序,结果中就只剩新增和缺少的项目。
- 如果其中一方是带有断行的 PDF 文字,可以先用删除换行符把行连起来,或者在单词模式下开启忽略空白。
- 对于中文和日文,单词模式高亮的是两个标点之间的整段文字,具体改了哪几个字,需要在高亮范围内自己确认。
常见问题
文本会被上传吗?
不会。两段文本只存在于页面中,对比在你自己的设备上进行。对比尚未公开的合同、私人往来信件或公司源代码时,这一点至关重要。
能对比 Word 文档或 PDF 吗?
请从各个文件中复制出文字,分别粘贴到两个文本框里。加粗、字体等格式不参与对比,只比较文字本身。
为什么整段都被标为修改?
在行模式下,一个段落就是一行,段落中任何地方的修改都会让整行被标为修改。切换到单词模式,就能看到具体改了哪些词。
有大小限制吗?
文本本身的长度没有限制。如前所述,不同部分的改动超过 2,000 处时会停止详细对比;但如果两段文本大部分内容相同,即使很长也没有问题。