ChatGPT解决这个技术问题 Extra ChatGPT

为什么 Windows 使用 CR LF?

我了解两者之间的区别,因此无需深入探讨,但我只是想知道 Windows 使用 CR 和 LF 来指示换行符的原因是什么。似乎 Linux 方法(仅使用 LF)更有意义、节省空间并且更易于解析。

这是关于换行符历史的维基百科:en.wikipedia.org/wiki/Newline#History
可能值得注意的是,Windows 上的 CRLF 主要只是一个约定/默认值。大多数程序都支持(尽管您可能不得不弄乱设置)。我个人几乎从不使用 CRLF,而是选择了 UNIX 风格的 LF;只有少数程序仍然存在仅使用 LF 的文件的问题。
CR+LF 是正确的方法(它是标准),所以问题不在于为什么 Windows 正确,而是为什么 Mac 和 Unix/Linux 不正确。 Standalone LF 的遗产是懒惰和走捷径。我总是 CR+LF,除了某些 Linux 的东西会在 CR+LF 上傻眼,所以我为此更改为 LF 模式。 IMO,曲解 CR+LF 比曲解独立的 LF 要糟糕得多。
@TwistedCode 确实,我在自己的一些程序中确实使用了没有 LF 的 CR。回到行首而不跳到下一行是很有用的。它们通常配合得很好,但每个都可以单独使用。虽然 CR 本身比 LF 更有用

A
Anders Abel

从历史上看,当使用点阵打印机时,电传打字机 CR 会将托架返回到行的第一个位置,而 LF 将馈送到下一行。在文件本身中使用 CR+LF 可以将文件直接发送到打印机,而无需任何类型的打印机驱动程序。

感谢@zaph 指出它是电传打字机而不是点阵打印机


非常普遍的烦恼,但收益很小。
@Anders实际上是电传打字机的原因,CR将打印头返回到左侧,LF推进了纸张。电传打字机先于点阵打印机。
@zaph 这就是我喜欢 Stack Overflow 的原因。 2 年后,我得到了更正并学到了一些新东西。
由于 Windows 跟随 Unix 这么多年,令人费解的是,他们并没有遵循 LF 的 Unix 模型。
@belanger 令人费解的是,为什么 Unix 不遵循早于 Unix 的 DEC 或 ASA(美国标准协会)。我相信 DEC 使用了 CR/LF。我在大学使用的 IBM/360 也使用了 CRLF,但 EBCDIC 显然没有另外,请查看 RFC 0821 (SMTP)、RFC 1939 (POP)、RFC 2060 (IMAP) 或 RFC 2616 (HTTP)。他们使用 CR/LF。
M
Martin

@sshannin 从 Raymond Chen 的博客中发布了一个 URL,但它不再起作用了。该博客已更改其内部软件,因此 URL 已更改。

在浏览了新博客中的旧帖子后,我找到了它here

引用博客:

为什么行终止符是CR+LF?该协议可以追溯到电传打字机时代。 CR 代表“回车”——CR 控制字符将打印头(“回车”)返回到第 0 列,而不推进纸张。 LF 代表“换行”——LF 控制字符在不移动打印头的情况下将纸张前进一行。因此,如果您想将打印头返回到第 0 列(准备打印下一行)并推进纸张(以便在新纸上打印),您需要 CR 和 LF。如果您查看各种 Internet 协议文档,例如 RFC 0821 (SMTP)、RFC 1939 (POP)、RFC 2060 (IMAP) 或 RFC 2616 (HTTP),您会看到它们都将 CR+LF 指定为行终止序列。所以真正的问题不是“为什么 CP/M、MS-DOS 和 Win32 使用 CR+LF 作为行终止符?”而是“为什么其他人选择与这些标准文件不同并使用其他一些行终止符?” Unix 采用纯 LF 作为行终止序列。如果您查看 stty 选项,您会看到 onlcr 选项指定是否应将 LF 更改为 CR+LF。如果这个设置有误,你会得到阶梯式文本,每行从上一行停止的地方开始。因此,即使是 unix,当处于原始模式时,也需要 CR+LF 来终止行。 LF 之前的隐式 CR 是一个 unix 发明,可能是一种经济,因为它每行节省一个字节。 C 语言的 unix 祖先将这种约定带入了 C 语言标准,它只需要“\n”(对 LF 进行编码)来终止行,从而将原始文件数据转换为逻辑行的运行时库的负担加重。 C语言还引入了“换行符”一词来表达“通用行终止符”的概念。有人告诉我,ASCII 委员会在 1996 年左右将字符 0x0A 的名称更改为“换行符”,因此混淆程度更高了。这是从 Unix 的角度对这个主题的另一个讨论

我已将第二个链接更改为 The Wayback Machine 中的快照,因为实际页面不再可用。

我希望这回答了你的问题。


由于您并没有真正回答问题,只是更正了一个已经过时的链接,在评论中,这应该是真正的评论。无论如何,感谢您提供正确的链接。请将其添加为评论,此答案可能会被删除。
好的,我已经在此处添加了博客中的文本,因此如果链接再次失效,文本仍然可以在此处使用。我认为这应该保留为答案,而不仅仅是评论,因为这些信息实际上回答了最初提出的问题。
我真的很讨厌微软定期淘汰他们的链接的方式。
这个答案比例外答案更详细,不仅回答了问题,而且回答了问题的猜测原因,恕我直言,它更好。
建议 SMTP、POP、IMAP 和 HTTP 以某种方式定义 '\n' 含义的标准是非常愚蠢的!!!这些定义了人们应该如何使用那些非常古老的协议进行通信。所有这些协议都做出了相同的选择,可能是基于第一个和更早的选择。我不认为 *nixes 使用 CR 或 LF。他们使用“新行”。机器级别非常低,需要您将它们告诉 LF 和 CR。继续使用它真的没有意义,因为当我的浏览器与 Apache 通信时,它确实使用了 CRLF。
D
Dave Markle

它来自过去的电传打字机(和打字机)。

过去,当您完成一行输入时,您必须将打字机的托架(它固定纸张并在您输入时向左滑动)回到行首 (CR)。然后,您必须将纸张向前推进一行 (LF) 才能移动到下一行。

在某些情况下,您可能不想在返回马车时换行,例如,如果您打算用破折号删除一个字符(您只需覆盖它)。

但基本上,它归结为惯例。 DOS 使用完整的 CR/LF 约定,而 UNIX 将其缩短了一点。现在我们被困住了!


N
Nick Heidke

Wikipedia

CR+LF 序列在许多采用电传打字机(通常是 ASR33)作为控制台设备的早期计算机系统上普遍使用,因为需要该序列来将这些打印机定位在新行的开头。


B
Brent Bradburn

我已经看到不止一个帐户,大意是发送两个字符(有时更多)而不是一个字符的原因是为了更好地匹配数据传输速率和物理打印速率(这是很久以前的事了)。移动打印头比打印单个字符花费的时间更长,发送额外字符是防止数据传输超过打印设备的一种方法。因此,我们在 Windows 中使用多个字符作为行尾字符的原因与我们使用 QWERTY 键盘的原因基本相同——它旨在减慢速度。

显然,这种做法在 Windows 中一直持续到今天的原因是基于一些持续向后兼容的概念,最终只是简单的惯性。

但值得注意的是,Windows 在操作系统级别并未严格执行此约定。任何 Windows 应用程序都可以随意忽略该约定,具体取决于它试图兼容的其他应用程序。

有趣的是,Wikipedia article about "Newline" 声称 Windows 8 可能会引入对仅使用 LF 的更改。该文章还指出,Mac OS X 引入了从 LF+CR 到仅 LF 的转换。


“旨在减慢速度” - 需要引用。
实际上,整个第一段 - 需要引用。
这是一篇密切相关的 Jeff Atwood 文章,它引用了相同的 Wikipedia 内容:The Great Newline Schism。那里也有很多明智的用户评论——包括我的观点的一些证据,即这不是操作系统级别的问题,并且大多数 Windows 应用程序都可以很好地处理仅 LF 的文本文件。还有有趣的评论:“Windows 10 使用 CR/LF 来保持与 1963 Model 33 电传打字机的兼容性”。
@RenéG 我不需要引用,我在那里亲眼看到了。一些早期的点阵打印机甚至需要投入一些额外的 NUL 才能很好地衡量,因为随着接口波特率的增加,即使打印两个字符的时间,打印头也无法跟上。随着缓冲和流量控制的出现,这个问题就消失了,但早期的打印机没有。最后,当打印机变成只输出打印机时,它们使用了内置握手功能的并行接口。
“与流行的看法相反,QWERTY 布局并非旨在减慢打字员的速度,......” – Properties | QWERTY - Wikipedia