开发者工具·文本比较
每行都改变了?差异中的行尾、尾随空格和 BOM
· 工作原理
文本差异 行结束符 调试
诊断报告每一行不同的比较的三个看不见的原因,并展示如何在指责作者之前辨别出哪一个原因。
同一个文件,保存两次,显然是重写的——设置了在两个操作系统上编辑文件的常见情况
当编辑器更改不可见字符时,两次保存看起来像是重写,但 ToolAcre 的行为取决于更改的字符。它在匹配之前标准化行结尾,而行边缘的空格和开头的 U+FEFF 仍然是普通的行内容,除非另一个选项更改键。
构建一个诊断装置,而不是根据颜色猜测。比较一对仅结尾不同、另一对尾随空格不同、第三对具有前导 BOM。受控对比同时包含多个不可见更改的真实文件更可靠地揭示工具的边界。
CRLF 与 LF:每行末尾的字符 — 解释了为什么 Windows 以两个字符结束行,Unix 以一个字符结束行,以及 diff 如何看到额外的回车符
`splitLines` 用 LF 替换 CRLF 和单独的 CR,然后拆分。测试表明所有三种约定都会生成相同的数组。因此,即使关闭“忽略空白”,仅 CRLF 的差异也是不可见的;该大纲声称每行都会有所不同,这与此实现相矛盾。
最后的换行符也不会创建额外的行。拆分后,删除一个终端空条目。中间的真正空行仍然是比较单元,因此该行为将文件结束约定与文档内有意的垂直分隔区分开来。
ToolAcre 在比较之前对 CRLF、CR 和 LF 进行标准化,因此仅结尾的更改消失
尾随空格保留在原始行中。通过普通比较,`name=value` 和 `name=value ` 有不同的键。忽略空白会修剪两端并折叠内部运行,因此该选项可以使配对匹配,同时保留显示的相等行中的左侧原始文本。
该库还实现了更窄的 `ignoreTrailingWhitespace` 选项,但当前 UI 并未公开它。文章不得描述用户无法选择的复选框。附带的面板提供忽略大小写、忽略所有空白差异和折叠长期未更改的运行。
文件顶部的字节顺序标记 — 描述了一些编辑器在 UTF-8 文件前面添加的 U+FEFF 字符以及为什么它仅使第一行不同
解码为 JavaScript 文本的 UTF-8 字节顺序标记在第一行的开头为 U+FEFF。 `splitLines` 没有明确的 BOM 删除。通过普通匹配,该字符只能使第一行不同,而后面的行保持相同。
当忽略空白调用 `trim` 时,JavaScript 空白操作可能会将 U+FEFF 视为空白,但本文不会将其概括为文件解码行为。编辑器接收字符串;它不读取文件字节或报告编码。当字节级来源很重要时,检查实际字符。
工作示例:区分三个原因 - 给出决策路径:仅第一行的差异指向 BOM,每行都指向结尾,分散的行指向尾部空格
从 `alpha beta` 和 `alpha beta` 开始:结果是相同的。接下来将 `alpha beta` 与 `alpha beta` 进行比较:普通模式报告替换行,而空白模式则匹配它们。最后给一侧的alpha加上U+FEFF前缀,观察一线效果。
该序列使用经过存储库验证的操作来分隔原因。如果结束标准化后每行仍然不同,请调查内容、缩进或尾随字符,而不是仅仅归咎于 CRLF。如果只有第一行不同,请在重写整个文件之前检查其前导代码点。
使用空白选项作为诊断 — 展示了如何在 ToolAcre 的文本比较中启用忽略空白可以吸收尾随空格和行结束噪音,从而使真正的编辑脱颖而出
忽略空格对于尾随空格噪音很有用,因为它会修剪和压缩行键。它不负责隐藏 CRLF 与 LF;这在分裂期间已经发生了。将这些阶段分开可以防止得出关于哪个选项修复了比较的误导性结论。
运行两个视图,因为修剪可以隐藏有意义的缩进,而压缩可以改变固定宽度值或字符串文字。安静的标准化结果表明键在该转换下匹配。它不证明原始文件是字节相同的或语义上可互换的。
空白模式诊断尾随空格,而行结尾已经标准化
文本差异不会转换文件、配置 Git、更改编辑器设置或公开十六进制字节。它接受粘贴的字符串并报告行操作。有关 `.gitattributes`、`core.autocrlf` 或编码修复的建议属于可以单独验证其行为的工具。
该工具也无法区分不可见字符如何输入文本。格式化程序、剪贴板、解码器或手动编辑可能会产生相同的字符串。使用比较来定位行,然后在分配原因之前检查源管道。
要点:在指责作者之前检查不可见的内容 - 总结诊断路径并记录在浏览器中运行的比较,以便敏感文件保留在您的计算机上
按固定顺序检查不可见字符:结尾、尾随或内部空格,然后是前导特殊字符。 ToolAcre 的测试为第一类提供了可靠的结果,其选项有助于隔离第二类。第三种可能需要这条路线之外的性格检查员。
浏览器端的行分割使跨平台的结局差异在设计上消失。这很方便,但这也意味着该工具无法证明两个源文件使用相同的物理换行符字节。当需要保留精确的线路或存储库表示时,请选择字节感知实用程序。