当前语言: 中文 切换为英文

文本差异对比

粘贴两段文本,高亮显示差异。

差异

 
  1. 将原文粘贴到「文本 A」。
  2. 将修改后的版本粘贴到「文本 B」。
  3. 代码/配置选择「按行」,散文选择「按词」。
  4. 若有不可见差异干扰结果,打开「忽略空白」或「忽略大小写」。
  5. 查看下方高亮输出 —— 绿色是新增,红色是删除。
它能做什么?

此工具比较两段文本,精确显示新增、删除或保持不变的内容。「按行」将每一行视为一个单元 —— 适用于整行改动的源代码和配置文件。「按词」按空白分词,适合更关心词级别改动的散文。

示例

文本 A:

function greet(name) {
  console.log("Hello, " + name);
}

文本 B:

function greet(name) {
  if (!name) name = "world";
  console.log(`Hello, ${name}!`);
}

按行模式下的差异:

  function greet(name) {
+   if (!name) name = "world";
-   console.log("Hello, " + name);
+   console.log(`Hello, ${name}!`);
  }

常见错误与注意事项

看起来完全一样的行却被标为已改动时,罪魁祸首几乎总是不可见字符或大小写差异。常见原因如下。

  • CRLF 与 LF 行尾。 Windows 用 \r\n 结束行,Unix 用 \n。哪怕一个字节不同,每一行都会被标为改动。可启用「忽略空白」,或用 dos2unix / 编辑器设置统一。
  • 行尾空格。 除非忽略空白,否则 "foo " 与 "foo" 会被视为不同。保存时自动去除行尾空格的配置会让每一行看起来都变了。
  • 制表符与空格。 把制表符改成空格(反之亦然)的重新格式化,会让缩进的每一行在严格匹配下都显示不同。打开「忽略空白」,或先把两侧格式化成一致。
  • 字节顺序标记(BOM)。 以 UTF-8 with BOM 保存的文件,开头会有不可见的 。与无 BOM 文件对比时,首行总是显示为已改动。粘贴前用编辑器或十六进制编辑器移除 BOM。
  • 智能引号或不间断空格。 从字处理软件复制的文本可能把 " 换成 ",把普通空格换成不间断空格。看起来一样但码位不同。对比前请规范化为普通 ASCII。
  • 仅大小写不同。 API 与 api 除非开启「忽略大小写」,否则视为不同字符串。开启后只是比较放宽,显示出来的仍是原文。
常见问题

按行和按词模式有什么区别?

按行每次比较一行 —— 行内任何字符变化都会把整行标为在 A 中删除、在 B 中新增。按词按空白分词,粒度更细,更适合散文。对于源代码和配置文件,几乎总是按行更合适。

为什么看起来一样的行会显示为已改动?

通常是三种不可见差异之一:行尾(Windows CRLF 与 Unix LF)、行尾空格,或文件开头的字节顺序标记(BOM)。开启「忽略空白」可跳过前两种。对 BOM,用十六进制编辑器打开或在粘贴前去掉开头字节。

是不是逐字符比较?

不是。按行模式按行比较;按词模式按空白分隔的词比较。字符级比较对大多数真实文本来说输出太嘈杂。若只想对短字符串做字符级比较,把它们贴进按词模式 —— 没有空格时,每个字符实际上就是独立的一个词。

输入能有多大?

比较在内存中进行,实际上限是浏览器的 RAM。每侧几 MB 没有问题;几十 MB 时,渲染高亮 HTML 比算法本身更慢,标签页可能短暂卡住。超大文件请在本地用 GNU diff 或 git diff 运行。

可以忽略大小写或空白吗?

可以 —— 工具栏里有两个开关。「忽略空白」把任意连续空白视为等价,适合经过重新格式化的代码。「忽略大小写」把 "Hello" 与 "hello" 当作相同。显示的仍是原文,只是比较放宽。

你们会保存我粘到两个框里的文本吗?

不会。你粘贴到这里的任何内容 —— 无论是「改前」还是「改后」 —— 我们都不保留。只要你关闭或刷新页面,被对比的内容就会被丢弃。没有日志,没有对内容的分析。你可以在浏览器开发者工具中自行验证。