为什么Windows使用CR LF?

Kyl*_*yle 76 windows line-endings carriage-return linefeed

我理解两者之间的区别,所以没有必要进入,但我只是想知道为什么Windows使用CR和LF来表示换行的原因是什么.看起来Linux方法(只使用LF)更有意义,节省空间,更容易解析.

And*_*bel 84

历史上在使用时 点阵打印机 teletypes CR会将滑架返回到线路的第一个位置,而LF则会进入下一条线路.在文件中使用CR + LF可以直接将文件发送到打印机,而无需任何类型的打印机驱动程序.

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

  • 非常普遍的烦恼,一点点好处. (35认同)
  • @Anders实际上这是电视类型的原因,CR将打印头返回到左边,LF推进了纸张.电视类型先于点阵式打印机. (5认同)
  • @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。 (4认同)
  • @zaph这就是为什么我喜欢Stack Overflow。2年后,我得到了纠正并学到了一些新东西。 (2认同)

OMA*_*OMA 23

@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.如果你错误地设置了这个设置,你会得到阶梯式的文字

线

开始

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

C语言的unix祖先将此约定带入C语言标准,该标准仅需要"\n"(编码LF)来终止行,从而减轻了运行时库的负担,将原始文件数据转换为逻辑行.

C语言还引入了术语"换行符"来表达"通用行终止符"的概念.我被告知ASCII委员会在1996年左右将字符0x0A的名称改为"换行符",因此混淆程度已经提高到更高.

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

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

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

  • 我真的*讨厌微软定期淘汰他们的链接的方式. (5认同)
  • 这个答案比例外答案更详细,不仅回答了问题,还回答了问题的猜测原因,恕我直言,这更好。 (2认同)

Dav*_*kle 18

它来自昔日的电传打字机(和打字机).

过去,当你输入一行时,你必须将打字机的托架(它固定纸张并在键入时向左滑动)移回到行的开头(CR).然后,您必须将纸张向前推进(LF)以移动到下一行.

有些情况下你可能不想在返回马车时进行换行,例如你要用破折号删除一个角色(你只是覆盖它).

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