文本工具 · 文本对比 / 替换

文本对比

行级/字符级 diff(高亮增删改)

本地处理 · 不上传 免费 · 无需登录 无次数限制 累计 56 次使用
原文
对照
相同0
新增 +0
删除 −0
修改 ~0
原文对照
第一节

关于本工具

About

改稿时,两版文档逐行对,眼神一飘就漏掉一个逗号改句号。这个工具把两段文本并排,增、删、改的行和字符分别标色,一眼扫过去就知道哪里动过。代码合并前核对 diff、论文查重后确认修改点,都靠它。所有比对在浏览器本地完成,文本不上传服务器。

使用场景

合同条款变更核对

法务收到对方回传的《采购合同》,对方在「付款方式」和「违约责任」两处做了手写修改。人工逐字比对耗时且容易漏看。将扫描件 OCR 后粘贴到工具,开启字符级对比,工具立即用红色标出「30%→50%」的违约金比例变更,以及「验收后 15 日→30 日」的付款周期调整,确保修改点无一遗漏。

小说校对改稿

网文作者存了 3 个版本的章节草稿,自己记不清哪版是最终提交的。把 V2 和 V3 分别粘贴到左右输入框,工具以行级差异标出新增的 2 段心理描写和删除的 1 段环境描写。作者据此确认 V3 是定稿,避免了把旧版发给编辑导致返工。

代码版本冲突排查

前端开发者在合并分支时,发现同事修改了同一个 config 文件,但 Git 冲突提示只显示「冲突行号」,看不出具体改了什么。把本地分支代码和远程分支代码粘贴到工具,字符级高亮精准定位到「api_base_url」字段从 staging 环境被改成了 production 地址,快速决定保留哪一份配置。

学生论文查重后降重

毕业生拿到查重报告,标红段落需要改写。把原文和改写后的段落分别粘贴,工具用绿色显示新增内容、红色显示删除内容。学生发现改写时不小心删掉了两个关键实验数据,靠对比结果补回,保证降重不丢核心信息。

翻译稿审校比对

项目经理收到中译英的合同翻译稿,需要检查译员是否遗漏了「保密条款」中的具体年限。把中文原文和英文译文分别粘贴,行级对比快速框出中文第 12 行有「3 年」字样,英文对应位置只有「confidential period」而无数字,标记为漏译,要求译员补翻。

对比矩阵

维度本工具竞品 A (Diffchecker)传统方法 (手工对比)
隐私纯浏览器处理,文件不上传服务器文本上传至服务器进行对比完全离线,无网络传输
速度即时返回,无网络延迟受服务器响应速度影响人工逐行/逐字对比,速度极慢
离线可用支持,无需联网必须联网完全离线
大小限制无明确限制,受浏览器内存影响免费版有行数/字符数限制(如 2000 行)无限制,受人力与时间约束
注册无需注册免费版无需注册,付费版需账号无需注册
收费免费基础免费,高级功能付费免费(仅人力成本)
对比粒度行级 + 字符级高亮行级为主,部分支持字符级完全依赖人工,粒度可控但耗时
第二节

使用指南

Getting Started

使用步骤

  1. 1在左侧输入框中粘贴或键入原始文本,右侧输入框自动同步滚动,便于逐行对照
  2. 2点击「字符级」或「行级」按钮切换对比粒度,高亮区域即时刷新为新增(绿底)、删除(红底)、修改(黄底)标记
  3. 3点击任意高亮行,该行在左右两侧同时居中并显示差异详情,便于定位具体改动位置
  4. 4点击「复制差异」按钮,将高亮标记的差异文本(含颜色符号)复制到剪贴板,用于报告或文档粘贴

输入输出示例

输入输出说明
第一段: 今天天气很好。 我们一起去公园。 第二段: 今天天气很好。 我们一起去爬山。今天天气很好。 我们一起去公园。 我们一起去爬山。 (第2行:删除“公园” → 新增“爬山”)常规:行级 diff,仅一行不同,展示增删改高亮
第一段: abc 123 xyz 第二段: abc 123 xyz无差异。常规:完全相同的多行文本,验证工具正确处理无变化情况
第一段: 第二段: hello第1行:新增“hello”边界:空输入 vs 有内容,验证空行处理
第一段: A 第二段: A A第2行:新增“A”边界:重复行出现,验证工具是否误判为修改而非新增
第一段: 缩进行 第二段: 空格行第1行:删除“\t缩进行” → 新增“ 空格行”易错:制表符与空格视觉相似但字符不同,工具应区分
第一段: 中 文 第二段: 中文第1行:删除“中” → 第2行:删除“文” → 第1行:新增“中文”易错:中文字符跨行合并,验证字符级 diff 对中文分词的敏感度
第一段: line1 第二段: line1 line2 line3第2行:新增“line2” 第3行:新增“line3”边界:仅一方有大量新增行,验证多行追加场景

常见错误对照

1.把全角符号当成半角输入,导致差异误报

✗ 错误输入“,你好”(全角逗号) vs “,你好”(半角逗号)
✓ 修复统一使用半角逗号:",你好" vs ",你好"

文本对比工具按字符编码逐位比较,全角逗号(U+FF0C)和半角逗号(U+002C)是不同的 Unicode 码点,会被标记为修改而非无变化。

2.忽略末尾换行符差异,误以为内容不同

✗ 错误左侧文本最后一行有换行符,右侧没有
✓ 修复两侧文本末尾均不带换行符,或均带一个换行符

行级 diff 通常将换行符视为行的一部分,末尾多一个换行符会导致最后一行被标记为新增或删除。

3.用制表符缩进 vs 空格缩进,产生大量假差异

✗ 错误左侧用 \t 缩进,右侧用 4 个空格缩进
✓ 修复两侧统一使用空格缩进(如 4 空格)或统一使用制表符

制表符(U+0009)和空格(U+0020)是不同的字符,字符级 diff 会逐位显示差异,导致整段缩进被标红。

4.比较 JSON 时未先格式化,差异淹没在排版中

✗ 错误左侧 JSON 一行写完,右侧 JSON 格式化多行
✓ 修复两侧 JSON 先统一格式化(如用在线 JSON 格式化工具)再比较

字符级 diff 会把换行和缩进差异也高亮出来,实际仅排版不同,容易掩盖真正的内容变更。

5.复制文本时混入不可见控制字符

✗ 错误从 PDF 复制文本,中间带有零宽空格(U+200B)
✓ 修复粘贴后先用工具(如 Notepad++ 显示所有字符)检查,或通过正则替换 \u200B 为空

零宽空格、软连字符等不可见字符在界面上不显示,但 diff 会如实高亮,导致用户误以为内容有实质修改。

6.比较 URL 时忽略协议和斜杠差异

✗ 错误左侧 "https://example.com/path",右侧 "http://example.com/path/"
✓ 修复两侧统一协议(http/https)和尾部斜杠,或只比较路径部分

协议和尾部斜杠在语义上可能等价,但字符级 diff 会严格区分,产生非业务相关的差异标记。

7.将中文标点与英文标点混用

✗ 错误左侧“你好。”右侧“你好.”
✓ 修复两侧统一使用中文句号“。”或英文句号“.”

中文句号(U+3002)和英文句号(U+002E)码点不同,工具会标记为修改,实际语义相同但视觉差异明显。

第三节

工作原理

How It Works

核心公式

LCS(i,j) = 0, if i=0 or j=0; LCS(i-1,j-1)+1, if X[i]=Y[j]; max(LCS(i-1,j), LCS(i,j-1)), otherwise

变量说明

  • LCS(i,j)X[1..i]与Y[1..j]的最长公共子序列长度
  • X[i]旧文本第i个字符或行
  • Y[j]新文本第j个字符或行

示例

旧文本"abc"与新文本"acb":LCS(1,1)=1(a=a), LCS(2,2)=1(b≠c,取max(1,1)=1), LCS(3,3)=2(最后c=b不匹配,取max(2,1)=2)。最长公共子序列为"ab"或"ac",长度2。增删改操作数=3+3-2×2=2,即删除b并插入c,或删除c并插入b。

输入两段文本按行拆分逐行对比按字符拆分逐字符对比标记差异高亮输出增删改合并行级与字符级生成差异视图
输入与视图生成 本地拆分与对比 标记与输出
第四节

开发者集成

For Developers

5 种主流语言实现,复制即用:

import difflib text1 = """第一行 第二行 第三行""" text2 = """第一行 第二行修改 第三行 新增行""" diff = difflib.unified_diff( text1.splitlines(keepends=True), text2.splitlines(keepends=True), fromfile='原始文本', tofile='新文本' ) print(''.join(diff)) # 输出示例: # --- 原始文本 # +++ 新文本 # @@ -1,3 +1,4 @@ # 第一行 # -第二行 # +第二行修改 # 第三行 # +新增行
const { diffLines } = require('diff'); const oldText = '第一行\n第二行\n第三行'; const newText = '第一行\n第二行修改\n第三行\n新增行'; const changes = diffLines(oldText, newText); changes.forEach(part => { const prefix = part.added ? '+' : part.removed ? '-' : ' '; console.log(prefix + part.value); }); // 输出: // 第一行 // -第二行 // +第二行修改 // 第三行 // +新增行
package main import ( "fmt" "strings" "github.com/sergi/go-diff/diffmatchpatch" ) func main() { dmp := diffmatchpatch.New() a := "第一行\n第二行\n第三行" b := "第一行\n第二行修改\n第三行\n新增行" diffs := dmp.DiffMain(a, b, true) diffs = dmp.DiffCleanupSemantic(diffs) for _, d := range diffs { switch d.Type { case diffmatchpatch.DiffEqual: fmt.Print(" " + d.Text) case diffmatchpatch.DiffDelete: fmt.Print("- " + d.Text) case diffmatchpatch.DiffInsert: fmt.Print("+ " + d.Text) } } // 输出: // 第一行 // - 第二行 // + 第二行修改 // 第三行 // + 新增行 }
#!/bin/bash # 创建两个临时文件模拟输入 cat > /tmp/old.txt <<EOF 第一行 第二行 第三行 EOF cat > /tmp/new.txt <<EOF 第一行 第二行修改 第三行 新增行 EOF diff -u /tmp/old.txt /tmp/new.txt # 输出: # --- /tmp/old.txt # +++ /tmp/new.txt # @@ -1,3 +1,4 @@ # 第一行 # -第二行 # +第二行修改 # 第三行 # +新增行 rm /tmp/old.txt /tmp/new.txt
import java.util.*; public class DiffExample { public static void main(String[] args) { String oldText = "第一行\n第二行\n第三行"; String newText = "第一行\n第二行修改\n第三行\n新增行"; List<String> oldLines = Arrays.asList(oldText.split("\n")); List<String> newLines = Arrays.asList(newText.split("\n")); // 简单逐行对比(非 LCS 算法,仅演示行级差异) int maxLen = Math.max(oldLines.size(), newLines.size()); for (int i = 0; i < maxLen; i++) { String oldLine = i < oldLines.size() ? oldLines.get(i) : null; String newLine = i < newLines.size() ? newLines.get(i) : null; if (Objects.equals(oldLine, newLine)) { if (oldLine != null) System.out.println(" " + oldLine); } else { if (oldLine != null) System.out.println("- " + oldLine); if (newLine != null) System.out.println("+ " + newLine); } } // 输出: // 第一行 // - 第二行 // + 第二行修改 // 第三行 // + 新增行 } }
第五节

常见问题

Q & A
我复制了两段代码进去,怎么只显示了一行被删掉、其他都一样?是不是工具没识别出变化?

不是工具没识别,是当前默认行级 diff 模式。如果两段代码只有一行不同,其他行完全一样,工具会正确标出那行的增删标记(绿色/红色)。如果你想看同一行内具体改了哪个字符或标点,可以切换到字符级 diff 模式(通常在结果区上方有切换按钮)。代码比对建议先用行级看整体改动行,再用字符级看细节。

为什么我比对两段中文文本,明明意思一样,工具却标了一大片红色和绿色?

这是 diff 算法的正常结果。行级/字符级 diff 只比较字符序列的精确差异,不识别语义等价。比如“今天天气很好”和“今天天气不错”,字符序列不同(“很” vs “不”),工具就会标红删掉“很”、标绿添加“不”。如果你想忽略这种近义词差异,目前本工具不支持语义模糊匹配;建议比对前先把文本统一成相同表述再比对。

我粘贴了上万字的文章,工具会不会卡死或者报错?

本工具完全在浏览器本地运行(FE 实现),不依赖服务器,所以没有上传大小限制。但浏览器内存有限:一般几万字以内流畅运行,超过 10 万字可能需要等几秒。如果浏览器标签页卡住,可以尝试分段落比对(比如一次只比对 5000 字),或者关闭其他占用内存的标签页。工具本身不会主动报错,但若文本太长,浏览器可能弹出“页面无响应”提示,点“等待”即可。

这个工具会上传我的文本到服务器吗?我比对的是公司机密代码。

不会。本工具是纯前端实现(FE),所有文本比对计算都在你自己的浏览器里完成,没有任何数据上传到服务器。你粘贴的文本、比对结果都不会离开你的电脑。可以放心用于比对公司代码、合同草案等敏感内容。离线状态下(断网后)打开页面仍可使用,进一步证明无网络传输。

我贴了两段 JSON,工具标出的差异行是对的,但我想看具体哪个键值对变了,能实现吗?

目前本工具做的是纯文本行/字符级 diff,不会解析 JSON 结构。它会按行比对,如果某一行整个 JSON 对象不同,会标出整行增删;如果同一行内只有值不同(比如 "name": "Alice" 改成 "name": "Bob"),字符级 diff 能标出 "Alice" 到 "Bob" 的变化。但不会告诉你“键 name 的值从 Alice 变成 Bob”。如果需要结构化 JSON 比对,建议用专门的 JSON diff 工具。

为什么我比对两段英文,大小写不一样的地方没标出来?

默认情况下,本工具是区分大小写的。如果没标出来,请检查两段文本中对应位置是否真的只有大小写差异(比如 "Hello" vs "hello"),或者可能你复制时不小心包含了不可见字符(如空格、换行符)。建议先打开字符级 diff,再检查差异行中是否有空格被标出。如果确认是纯大小写差异但没标,可以尝试手动把两段文本都转成小写再比对,看是否一致。

我比对两个版本的合同,工具只标出了增删行,但我想知道修改了哪几个字,怎么操作?

在工具结果区,默认显示的是行级 diff(只标出整行新增或删除)。要查看同一行内具体改了什么字,点击结果区上方或行号旁边的“字符级”按钮(或“逐字比对”选项),切换后每一行内会显示绿色高亮(新增字符)和红色高亮(删除字符)。合同比对建议先用行级定位修改了哪些条款行,再用字符级看具体用词变化。

这个工具和在线 Word 文档里的“比较文档”功能有什么区别?

Word 的“比较文档”能识别段落移动、格式变化、插入批注等富文本差异,适合比对 .docx 文件。本工具只处理纯文本,不识别格式(加粗、颜色、字体),但优点是速度快、完全本地运行、无文件上传隐私风险。如果你只需要比对纯文字内容(代码、日志、配置文件等),本工具更轻量;如果你需要比对带格式的 Word 文件,建议直接用 Word 自带功能。

隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。

选择 打开 +新窗口 esc关闭