95

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

4

6 回答 6

109

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

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

于 2011-06-29T13:50:57.440 回答
35

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

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

引用博客:

为什么行终止符是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 作为行终止符?” 而是“为什么其他人选择不同于这些标准文档并使用其他一些行终止符?”</p>

Unix 采用纯 LF 作为行终止序列。如果您查看 stty 选项,您会看到 onlcr 选项指定是否应将 LF 更改为 CR+LF。如果这个设置有误,你会得到阶梯文本,其中

each
    line
        begins 

上一行停止的地方。因此,即使是 unix,当处于原始模式时,也需要 CR+LF 来终止行。LF 之前的隐式 CR 是一个 unix 发明,可能是一种经济,因为它每行节省一个字节。

C 语言的 unix 祖先将这种约定带入了 C 语言标准,它只需要“\n”(对 LF 进行编码)来终止行,从而将原始文件数据转换为逻辑行的运行时库的负担加重。

C语言还引入了“换行符”一词来表达“通用行终止符”的概念。有人告诉我,ASCII 委员会在 1996 年左右将字符 0x0A 的名称更改为“换行符”,因此混淆程度更高了。

这是从 Unix 的角度对这个主题的另一个讨论

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

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

于 2016-01-14T19:02:15.117 回答
19

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

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

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

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

于 2011-06-29T13:52:18.437 回答
3

其他人已经给出了答案,但我想补充一下……我猜你太年轻了,不会用打字机?;) 马车是一个鼓。将其水平向右移动,将固定式头部带回页面的左边距。用您的手指和拇指旋转笔架将页面前进一行。

于 2012-12-06T04:03:27.867 回答
2

来自维基百科

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

于 2011-06-29T13:51:50.560 回答
1

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

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

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

有趣的是,关于“换行符”的 Wikipedia 文章声称 Windows 8 可能会引入对仅使用 LF 的更改。该文章还指出,Mac OS X 引入了从 LF+CR 到仅 LF 的转换。

于 2012-01-09T20:02:42.073 回答