Skip to content

在线文本对比与差异工具

在浏览器内即时对比两段文本。双栏并排展示、行内单词级高亮、统一 diff 补丁导出,支持忽略大小写、空白与空行。100% 本地浏览器处理,无需上传,文本不离开你的设备。

无追踪 浏览器中运行 免费
所有对比均在你的浏览器本地运行。你的文本永远不会离开本设备。
忽略选项
已就与 `diff -u` 输出的一致性、行内 LCS 正确性及无障碍性(ARIA 角色、屏幕阅读器变更播报、RTL/LTR 处理)通过审核。 — Go Tools 文本工具团队 · 2026年5月21日

什么是文本对比?

文本对比是对两份文档进行结构化比较,找到将一份转换为另一份所需的最小插入与删除集合。输出会让变化可视化:新增行用绿色、删除行用红色,可双栏并排展示,也可以输出为 `git`、GitHub 与 Unix `patch` 命令使用的 `---/+++/@@` 统一补丁格式。

底层上,几乎所有现代 diff 都是最长公共子序列(LCS)算法。Eugene Myers 1986 年的 O((N+M)D) 论文是经典高效实现;经典动态规划(本工具采用,配合前缀/后缀裁剪)则更简单,对于典型 Web 场景输入工作得很好。行级对齐之后,相邻的删除 + 新增对会进入第二轮 token 级 LCS,渲染层只高亮一行内真正变化的单词 —— 评审人称之为行内 diff 或单词级 diff。

为什么不直接按字符比对?因为编辑很少是「扁平」的:在一份 200 行文件中间插入一行,会让下方每一行都偏移。朴素的 `===` 会把后面 199 行都算作不同。LCS 才告诉你真相:新增 1 行,199 行未变。

本工具的整个对比都在你的浏览器中运行。不上传、不写临时文件、不留日志。对专有代码、红线合同、私有日志,任何你不希望粘到第三方服务器上的内容都安全。需要对比 JSON?请使用结构化的 JSON Diff,这样键顺序与空白就不再是噪声。在比较 YAML 或 CSV 配置?先用 YAML 转 JSONJSON 转 CSV 转换,再用与格式匹配的工具 diff。

// Two strings that look 'mostly the same' but a naïve check disagrees
const a = 'hello world';
const b = 'hello, world!';

// Character equality
a === b; // false — but only 3 characters actually changed.

// LCS-style diff (this tool, at line + word granularity)
// → 1 line modified, inline highlight: 'hello[, ]world[!]'
// → unified patch:
//   --- original
//   +++ modified
//   @@ -1 +1 @@
//   -hello world
//   +hello, world!

核心特性

双栏 + 统一双视图

在双栏可视化视图(供人工阅读)与统一 diff 补丁格式(用于 `git apply`、评审工具、bug 报告)之间一键切换。

行内单词级高亮

当两行被配对为修改时,只有变化的 token 带有彩色背景。你的视线会立刻落在编辑处,而不是扫过 80 个字符。

忽略大小写 / 空白 / 空行

四个独立开关:大小写、所有空白、仅行尾空白、空行。两次点击即可复现 `git diff -i -w -b`。

统一 diff 导出

复制带 3 行上下文的干净 `---/+++/@@` 补丁。可直接粘进 PR 评论、bug 报告或交给 `patch -p1` 应用。

100% 浏览器内运行

输入永不离开你的设备。不上传、不对文本做任何分析。页面加载后可离线工作。对专有代码与机密文本安全。

Unicode 与 RTL 支持

按 Unicode 单词边界切分 token。阿拉伯语、希伯来语、CJK 内容均可干净对比;CRLF、LF、CR 行尾变体都会被规范化。

示例

代码评审 — 一次变量重命名

function getUser(id) {
  const u = db.users.find(x => x.id === id);
  return u;
}
function getUser(userId) {
  const u = db.users.find(x => x.id === userId);
  return u;
}

双栏视图高亮每一行重命名涉及的行,而行内 word diff 会让未改动的 token 变暗,评审人能一眼看出具体改了哪个标识符。

合同修订 — 新增一条条款

1. The service is provided as-is.
2. Either party may terminate with 30 days notice.
3. Disputes are resolved in California courts.
1. The service is provided as-is.
2. Either party may terminate with 30 days notice.
2a. Termination notice must be in writing.
3. Disputes are resolved in California courts.

新增的单条条款(第 2a 行)是唯一差异。上下文行保持整洁,非常适合合同或政策文档的红线标注。

日志排查 — 请求耗时变化

GET /api/users 200 14ms
POST /api/orders 201 88ms
GET /api/orders/42 200 21ms
GET /api/users 200 14ms
POST /api/orders 201 4200ms
GET /api/orders/42 500 21ms

两行发生变化。行内高亮显示 88ms → 4200ms 的延迟漂移以及 200 → 500 的状态码异常,事故时间线排查的标准动作。

行尾空白 — 切换「忽略行尾」选项

  margin: 0;  
  padding: 0;
  border: none;
  margin: 0;
  padding: 0;
  border: none;

默认情况下,第 1 行会被标记为差异(多了行尾空格)。打开「忽略行尾空格 / 制表符」选项,差异归零,与 `git diff -b` 的行为一致。

使用方法

  1. 1

    粘贴两个版本

    原始文本放左侧,修改后的文本放右侧。边输入边渲染 diff;合并大于 200 KB 的输入会切换为手动 Diff 按钮。

  2. 2

    按需打开忽略选项

    忽略大小写、忽略所有空白、忽略行尾空格、忽略空行 —— 各自独立,跨访问保留。

  3. 3

    阅读 diff 或获取补丁

    双栏视图供人工阅读,统一视图获得 `---/+++/@@` 补丁格式。「复制统一 diff」将干净的补丁复制到剪贴板,可用于代码评审或 `patch -p1`。

常见 Diff 陷阱

Windows 与 Unix 互拷后整文件「全变了」

如果你从 Windows Notepad 粘贴到 Unix 编辑过的原文里,每一行都会出现 \r 差异。打开「忽略行尾空格 / 制表符」即可消除 CR 字符的噪声。

✗ 错误
Diff: 200 处修改(全是行尾 \r 引起)
✓ 正确
忽略行尾空格 / 制表符 → 2 处真实改动

仅缩进差异却铺天盖地

Tab ↔ 空格的重新格式化会把行级 diff 炸到无法看。「忽略所有空白」会把 diff 收敛到真正的语义改动。

✗ 错误
Diff: 87 处修改(全是缩进变化)
✓ 正确
忽略所有空白 → 4 处真实改动

因为多了一个空行,整段被标为变化

散文中增加或删除一个空行,可能让整个区域错位。「忽略空行」无需改动内容即可修正。

✗ 错误
Diff: 第 2 段「完全变了」(只是空行位置移动)
✓ 正确
忽略空行 → 第 2 段无变化

diff 显示「相同」,但文件确实不同

几乎总是因为上次会话的某个忽略选项还开着。打开「忽略选项」面板 —— 所有开关都列在那里。要做字节级严格对比,把它们全部关掉。

✗ 错误
显示 0 处差异,但 `cmp` 说文件不同
✓ 正确
关闭所有忽略选项 → 真实的 diff 出现

粘进 JSON 看起来「全变了」

文本 diff 把键顺序视为有意义,而 JSON 不是。JSON 载荷请用专门的 JSON Diff,它会忽略键顺序并尊重类型严格性。

✗ 错误
对 JSON 做文本 diff: 100% 行变化(其实只是键重排)
✓ 正确
<a href="/zh/tools/json-diff">JSON Diff</a>: 0 处差异

忽略了「diff 已截断」警告

每边超过 5,000 行的输入会被截断。看到警告就改用命令行 `diff -u file1 file2` 或 `git diff --no-index` —— 两者都以流式方式处理 GB 级文件。

✗ 错误
粘了 20,000 行日志 —— 只对比了前 5,000 行
✓ 正确
在终端用 `diff -u a.log b.log` 处理完整文件

常见使用场景

代码评审片段
把同一函数的两个版本丢进左右两栏,一眼看出重命名、被删除的分支或新增的守卫子句。对于一行级别的改动,行内单词高亮比扫 GitHub diff 还快。
合同 / 政策红线对比
粘贴昨日合同与今日修订版。新增条款一目了然,未变段落淡为灰色。导出统一补丁作为法务评审留痕。
日志时间线排查
拿事故前的日志切片对比事故中的日志切片。延迟、状态码、频率漂移立刻浮现,无需 `awk`。
稿件 / 草稿修订
粘贴你的草稿与编辑修改后的版本。行内单词 diff 精准展示哪些句子被重写 —— 用于逐条接受或拒绝改动非常宝贵。
翻译评审
把旧译本对比重译版,确认新文本保留了语义、结构与占位符。开启「忽略行尾空格」可消除译者常引入的尾随空白噪声。
配置 / .env 文件审计
对比两份 `.env`、`docker-compose.yaml` 或 shell rc 文件。打开「忽略空行」后,diff 会聚焦于功能性差异而非格式波动。

技术细节

带前缀/后缀裁剪的 LCS
运行动态规划 LCS 之前,会先剥掉公共前导与后缀行。「两份 2,000 行配置仅一行不同」的 diff 会坍缩成 1×1 的 DP 表,渲染时间不到 1 毫秒。
Token 级行内 diff
相邻的删除 + 新增 hunk 被配对,并按 Unicode 的单词/非单词/空白连串切 token。第二轮 LCS 产出绿/红 token 段,让修改行可读。
统一 diff 与 git/patch 兼容
输出遵循为 GNU patch 定义的 `---/+++/@@ -L,C +L,C @@` 格式,Git、GitHub 与所有代码评审工具都在用。可通过 `pbpaste | patch -p0` 应用。
每边 5,000 行的输入上限
超过上限会截断并告警。多 MB 输入请使用命令行 `diff -u` 或 `git diff --no-index`,它们以流式方式处理 GB 级文件。

最佳实践

先选好忽略选项再读
行尾空格、CRLF、大小写噪声会淹没信号。先打开正确的忽略选项,diff 会好读得多,你也不必再训练自己跳过「假」差异。
分享用统一 diff,评审用双栏
可视化列给你的眼睛看,统一 diff 给别人的终端。复制的统一 diff 可以无翻译地丢到 Slack 消息、Jira 评论或 `patch -p1` 里。
用相似度 % 做完整性检查
如果两份文件「基本相同」但相似度却只有 30%,你大概率遇到了行尾或空白问题。打开「忽略所有空白」再次比对,然后再读 diff。

常见问题

我粘贴的文本会发送到你们服务器吗?
不会。每一次对比都在浏览器内的 JavaScript 中运行。你的文本不会上传、记录、写入磁盘,也不会发送给任何第三方。仅有 UI 偏好(视图模式与忽略选项开关)会保存到 localStorage,以便下次访问时记住设置,文本本身从不保存。你可以打开 DevTools → 网络面板验证:点击 Diff 时不会发出任何请求。
文本 diff 和 JSON diff 有什么区别?
文本 diff 按行对比,适合散文、代码、日志、合同、配置文件。JSON Diff 理解 JSON 的数据模型:键顺序无关紧要、类型严格匹配、数组可按键值配对。如果把 JSON 粘到文本 diff 里,键重排和空白差异都会被标为变更;JSON Diff 则会忽略它们。非结构化内容用文本 diff,API 响应和配置载荷用 JSON Diff。
如何忽略空白、大小写或空行?
点击 diff 上方的「忽略选项」面板。「忽略大小写」让 A 和 a 视为相等。「忽略所有空白」在对比前折叠所有空格、制表符和换行。「忽略行尾空格 / 制表符」仅去除行尾空白,即 `git diff -b` 的标准行为。「忽略空行」会在 diff 前丢弃空行/纯空白行。每个选项独立生效,并跨会话保留。
什么是统一 diff(unified diff)?何时需要复制它?
统一 diff 是 `---/+++/@@` 文本格式,被 `patch`、`git apply`、GitHub PR 以及大多数代码评审工具使用。点击「复制统一 diff」即可获得每处变更前后各 3 行上下文的补丁,粘到 bug 报告、代码评审评论中,或丢给 `patch -p1` 命令都能直接应用。双栏视图给人看,统一 diff 给机器看(以及思维像机器的评审者)。
为什么只改了一个词,diff 却显示整行变了?
并没有 —— 仔细看。整行被高亮是因为这一行上有内容变化,但高亮内部只有变更的 token 才会带亮色背景(绿色表示新增,红色删除线表示移除)。这就是行内单词级 diff:行的上下文保持可读,而你的视线直接落在具体的改动上。如果连续两行都被修改,两行都会显示行内高亮。
CRLF 与 LF 行尾如何处理?
两者都能识别。diff 会按 \r\n、\n 和裸 \r 分行,因此 Windows CRLF、Unix LF 和老 Mac 的 CR 文本都能正确对齐。如果你想专门标记行尾差异,关闭「忽略行尾空格 / 制表符」,\r 会作为行尾字符显示出来。若想彻底消除行尾噪声,打开「忽略所有空白」即可。
两边输入最大能多大?
diff 运行在主线程,实践上限约为每边 5,000 行或 1 MB,超过会裁剪并显示警告。合并输入超过 200 KB 时会禁用实时 diff,切换为手动 Diff 按钮。对于数 MB 的大文件,请使用命令行 `diff -u` 或 `git diff --no-index`,它们以流式方式处理 GB 级文件。
能用来 diff 代码吗?支持我用的语言吗?
diff 与语言无关:它只看行和 token,不解析语法。这对评审片段、配置改动和拷贝粘贴的补丁反而是好事。如果需要语义级代码 diff(跨文件函数重命名、AST 级别),请使用 git、GitHub PR 视图或专门的结构化 diff 工具。但 90% 的代码评审场景 —— 看一段函数、对比两个片段 —— 行 + 单词级 diff 就够用了。
为什么单次编辑有时显示为一删一加两行?
当一行的变化太大,单词级高亮不再实用时,diff 会拆成独立的删除行 + 新增行,保持结构清晰。同样的启发式策略也让散文重写和代码块重写的输出可读。切到「统一」视图,你会看到补丁中经典的 `-`/`+` 配对格式。
% 相似度是怎么计算的?
未变化行数(应用忽略选项之后)除以两边行数中较大者,上限 100%。两段完全相同的输入为 100%。在 100 行文件里新增 1 行得到 99%。每一行都被替换为 0%。可以快速判断「这是一次小修改,还是整体重写」,再决定是否细读 diff。
能把 diff 分享给同事吗?
可以,两种方式。(1) 点击「复制统一 diff」,把补丁粘到聊天、Slack 或 PR 评论中 —— 有终端的人都能用 `patch < clip` 应用。(2) 对双栏面板截图用于可视化评审。我们故意没有提供「按 URL 分享」按钮:那需要上传你的文本,而我们不会做这件事。
diff 支持阿拉伯语、希伯来语等从右到左的语言吗?
支持。文本内容方面 —— 行和 token 都是 Unicode 感知的。界面使用逻辑方向 CSS,RTL 语言下行号槽和列会自然翻转。在 diff 单元格内部,文本方向跟随内容本身,因此阿拉伯语和希伯来语字符串会正确渲染,而 +/- 标记仍对齐到行号槽。

免费正则表达式测试器 — 在线实时匹配与调试

文本处理

在浏览器里实时测试正则表达式:高亮匹配、捕获组、命名分组、替换预览、字符串切分与逐 token 解释,支持 JavaScript(ECMA-262)方言、g/i/m/s/u/y/d 七个 flag、ReDoS 超时保护。100% 本地运行、免费、无需注册。

免费字数统计与字符计数工具

文本处理

在浏览器里实时统计单词数、字符数、句子、段落与阅读时间,并对照 Twitter、meta description、Instagram 等平台字符限制给出实时进度条。免费、隐私、无需注册。

进制转换器 — 二进制、十六进制、十进制、八进制互转

转换工具

在线免费进制转换工具,支持二进制、八进制、十进制、十六进制及 2-36 任意进制互转。无需注册,数据不离开浏览器,即时获取结果。

Base64 解码与编码工具

编码和格式化

免费在线 Base64 解码编码工具。实时转换,支持中文和 Emoji,100% 浏览器端运行,数据不离开设备,无需注册。

Crontab 生成器与 Cron 表达式构建工具

日期和时间

在浏览器里构建、校验并解读 cron 表达式,按本地时间或 UTC 实时预览下一次运行。支持 POSIX 五字段语法、常用预设和中文描述。免费、隐私、无需注册。

CSV 转 JSON 转换器

编码和格式化

在浏览器中将 CSV 转换为 JSON。支持 RFC 4180、类型推断、表头行、大整数安全。100% 隐私,无需上传。