开发者工具·文本比较
为什么 Windows 和 Unix 在行结尾上不一致:CR、LF 和 CRLF 的故事
· 背景
文本差异 行结束符 软件历史记录
跟踪从打字机和电传打字机到现代操作系统的行结尾,并解释为什么两种约定仍然在每个跨平台项目中共存。
一个看不见的角色,数十年的摩擦——以持续的跨平台烦恼打开
行结尾在普通编辑器中是不可见的,但对文件和协议可能很重要。然而,在 ToolAcre 中,CR、LF 和 CRLF 在行比较之前被标准化。仅这些分隔符不同的一对会产生相同的线阵列和相同的结果。
该行为解决了该路线的实际问题,同时限制了它可以诊断的内容。比较无法证明文本到达编辑器后原始文件包含哪些换行字节。保存或协议检查需要字节感知工具。
打字机上的回车和换行 — 解释了角色最初描述的两个物理动作
术语回车和换行具有物理和历史含义,但存储库不包含打字机源。即使这个叙述听起来很熟悉,凭记忆重复机械起源故事也会违反证据合同。
视为 ` ` 代码单元,将 LF 视为 ` ` 仅在实现使用它们的地方。历史解释应在以后从主要标准或档案中添加,而不是从明确不是来源的大纲中借用。
打字机含义是需要外部来源的历史主张
同样,源文件不记录电传打字约定或早期操作系统决策。它们仅揭示了当前 JavaScript 中的兼容性选择:在拆分之前用 LF 替换每个 CRLF 或单独的 CR。
该转换接受根据多种约定生成的粘贴文本,而不用仅结尾更改填充输出。这是一个在一个正则表达式中可见的实现决策,并由所有三种形式的测试固定。
电传打字机和操作系统谱系位于存储库证据之外
通常将 Unix 与 LF 关联起来,将 Windows 与 CRLF 关联起来,将旧系统与单独的 CR 关联起来,但当前的存储库不能作为这些采用的历史证明。安全声明可操作:所有三个输入在 `splitLines` 内变为 LF。
终端 LF 不会创建最终的空行,而中间的空白行仍然存在。这种区别意味着即使物理分隔符差异被删除,逻辑内容仍被保留。比较是面向行的,而不是保留字节的。
代码证明了三个约定规范化;它并不能证明为什么系统采用它们
一些网络和消息协议指定了精确的线路终止符,但它们的要求必须来自它们的规范。 ToolAcre 的标准化使其不适合证明与这种有线格式的一致性,因为原始分隔符证据被有意删除。
当精确的 CRLF 序列很重要时,在解析之前使用十六进制查看器或协议验证器。干净的文本差异结果可以确认匹配的逻辑行并同时隐藏传输级缺陷。这两种观察都可能是正确的,因为这些工具回答了不同的问题。
协议要求需要有自己的规范,此处省略
比较 `alpha beta`, `alpha beta` and `alpha beta` 成对出现。每个产生两条线,α和β,并且没有添加或删除。忽略空白不会导致这种平等;分裂期间已经发生了标准化。
将尾随空格添加到一个测试行,普通模式现在将报告差异。启用忽略空白,它可能会消失。该序列将换行符处理与行键空白处理分开,并防止记入错误的选项。
工作示例:所有三种结尾形式在空白选项之前比较为相等
此路线不配置编辑器、重写文件、设置 Git 属性或批量转换结尾。它还不会暴露结果行中的原始分隔符。粘贴的字符串进入比较管道,而不是换行迁移实用程序。
历史因果关系和协议标准被省略,待定来源。这种限制留下了一篇更小但更精确的文章:在这个实现中三个约定做了什么,保留了哪些空行以及为什么这里的相等不建立字节标识。
要点:了解您的文本采用哪种约定 - 总结历史以及 ToolAcre 的文本比较如何帮助确认差异是否仅是行结尾
了解哪些证据在该工具中幸存下来。标准化后,ToolAcre 可以比较公共分隔符之间的逻辑行内容。它无法告诉您源使用了哪种约定,也无法告诉您下游消费者是否需要一个确切的字节序列。
使用浏览器差异进行人工审查,并使用字节级检查来执行存储库或协议。当工具的转换是明确的时,它就是可靠的;审阅者仍然有责任选择一个保留他们需要验证的属性的人。