文本差异对比
粘贴两段文本,高亮显示差异。
差异
- 将原文粘贴到「文本 A」。
- 将修改后的版本粘贴到「文本 B」。
- 代码/配置选择「按行」,散文选择「按词」。
- 若有不可见差异干扰结果,打开「忽略空白」或「忽略大小写」。
- 查看下方高亮输出 —— 绿色是新增,红色是删除。
它能做什么?
此工具比较两段文本,精确显示新增、删除或保持不变的内容。「按行」将每一行视为一个单元 —— 适用于整行改动的源代码和配置文件。「按词」按空白分词,适合更关心词级别改动的散文。
示例
文本 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" 当作相同。显示的仍是原文,只是比较放宽。
你们会保存我粘到两个框里的文本吗?
不会。你粘贴到这里的任何内容 —— 无论是「改前」还是「改后」 —— 我们都不保留。只要你关闭或刷新页面,被对比的内容就会被丢弃。没有日志,没有对内容的分析。你可以在浏览器开发者工具中自行验证。