Windows为什么使用CR LF?


85

我了解两者之间的区别,因此无需赘述,但我只是想知道Windows为什么同时使用CR和LF来指示换行的背后原因是什么。看起来Linux方法(仅使用LF)更有意义,节省空间并且更易于解析。




以下是有关换行历史的维基百科:en.wikipedia.org/wiki/Newline#History
Szocske 2011年

可能值得注意的是,Windows上的CRLF仅是一种约定/默认设置。大多数程序都支持(尽管您可能必须弄乱设置)。我个人几乎从来不使用CRLF,而是选择了UNIX风格的LF。只有少数程序仍然对仅使用LF的文件有问题。
凯文(Kevin)

CR + LF是执行此操作的正确方法(这是标准方法),因此问题不是Windows为什么会正确执行,而是Mac和Unix / Linux为什么会错误执行。独立LF的遗产是懒惰,走捷径。我总是使用CR + LF,但某些Linux东西会凝视CR + LF,因此我将其更改为LF模式。IMO,误解CR + LF比误解独立LF严重得多。
相互关联的

Answers:


96

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

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


46
非常常见的烦恼,几乎没有好处。
戴维·霍瓦斯

7
@Anders实际上是电传打字的原因,CR将打印头向左移,而LF使纸张前进。电传打字机先于点阵打印机。
zaph

5
@zaph这就是为什么我喜欢Stack Overflow。2年后,我得到了纠正并学到了一些新东西。
安德斯·亚伯

30

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

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

引用博客:

为什么线路终止器为CR + LF?

该协议可以追溯到电传打字机的时代。CR代表“回车” – CR控制字符将打印头(“回车”)返回到第0列而不前进纸。LF代表“换行” – LF控制字符使纸张前进了一行,而无需移动打印头。因此,如果您想将打印头返回到第零列(准备打印下一行)并前进纸张(以便在新纸上打印),则需要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。如果此设置有误,则会显示stairstep文本,其中

each
    line
        begins 

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

C语言的统一祖先将此约定引入了C语言标准,该标准只需要“ \ n”(对LF进行编码)即可终止行,这给运行库提供了将原始文件数据转换为逻辑行的负担。

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

从UNIX的角度来看这是该主题的另一个讨论

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

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


由于您并没有真正回答问题,只是在评论中更正了已过期的链接,这实际上应该是评论。无论如何,感谢您的正确链接。请添加为评论,此答案可能被删除。
汤姆·布伦伯格

1
好的,我已经在此处添加了博客的文本,因此,如果链接再次出现问题,此处的文本仍然可用。我认为这应该作为答案,而不仅仅是评论,因为这些信息实际上可以回答最初提出的问题。
OMA

7
真的很讨厌Microsoft定期淘汰其链接的方式。
Mark Ransom

1
这个答案比例外的答案更详细,不仅回答问题,而且回答问题的猜测原因,恕我直言也更好。
阿列克谢·马蒂安诺夫

18

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

过去,当您完成一行的输入时,必须将打字机的笔架(握住纸张并在键入时向左滑动)移回到该行的开头(CR)。然后,您必须将纸张下移(LF)到下一行。

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

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


2

其他人给出了答案,但我想补充一下...我想您还太年轻,无法使用打字机?;)托架是鼓。向右水平移动它,将固定式打印头移回页面的左边缘。用手指和拇指旋转笔架,使页面前进一行。


2
打字机?我想我曾经在博物馆里看到过其中一个:)
凯尔(Kyle)

@Kyle我不得不笑了,这使我的生活更加美好:)
likejudo

1

维基百科

CR + LF序列在许多采用电传打字机(通常为ASR33)作为控制台设备的早期计算机系统中普遍使用,因为需要此序列将这些打印机放置在新生产线的开头。


1

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

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

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

有趣的是,维基百科有关“ Newline”的文章声称Windows 8可能会引入仅使用LF的更改。文章还指出,Mac OS X引入了从LF + CR到仅LF的过渡。


4
“旨在减慢速度”-需要引用。
Elliot Gorokhovsky

4
实际上,整个第一段-需要引用。
Elliot Gorokhovsky'3

2
这是与Jeff Atwood密切相关的文章,该文章引用了相同的Wikipedia内容:The Great Newline Schism。那里也有很多智能的用户评论-包括一些我的观点,即这不是操作系统级别的问题,并且大多数Windows应用程序都可以与仅LF文本文件一起使用。还有一个有趣的评论:“ Windows 10使用CR / LF来保持与1963年Model 33电传打字机的兼容性”。
布伦特·布拉德本

1
@RenéG我不需要引用,我在那儿亲眼所见。一些早期的点矩阵打印机甚至需要投入一些额外的NUL,因为随着接口波特率的提高,即使花费了两个字符的时间,打印头也无法跟上。随着缓冲和流控制进入图像,这个问题消失了,但是早期的打印机没有。最终,当打印机变成仅输出时,他们进入具有内置握手功能的并行接口。
Mark Ransom

1
“与普遍的看法相反,QWERTY布局的设计并不是为了减慢打字员的速度……” –属性| QWERTY-维基百科
Jason Sparc,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.