回车-为什么Windows使用CR LF



我理解两者之间的区别,所以没有必要赘述,但我只是想知道Windows为什么同时使用CR和LF来表示换行符背后的原因是什么。Linux方法(只使用LF)似乎更有意义,节省了空间,而且更容易解析。

历史上,当使用

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

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

@shannin发布了Raymond Chen博客中的URL,但它已经不起作用了。博客更改了内部软件,因此URL也发生了变化。

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

引用自博客:

为什么线路端接器是CR+LF?

这个协议可以追溯到电传打字机时代。CR支架对于"回车",CR控制字符返回打印在不推进纸张的情况下将头("滑架")移至第0列。LF支架对于"换行",LF控制字符将纸张提前一行而不移动打印头。所以如果你想归还印刷品转到第0列(准备打印下一行),并将纸张(所以它打印在新的纸张上),你需要CR和LF。

如果您查看各种互联网协议文档,如RFC 0821(SMTP)、RFC 1939(POP)、RFC 2060(IMAP)或RFC 2616(HTTP)看到它们都指定CR+LF作为线路终止序列。所以真正的问题不是"为什么CP/M、MS-DOS和Win32使用CR+LF作为线路终端?"而是"为什么其他人选择与这些标准文件不同,使用其他行终结者?"

Unix采用了纯LF作为行终止序列。如果你看在stty选项中,您将看到onlr选项指定LF应改为CR+LF。如果你弄错了这个设置,你获取阶梯式文本,其中

each
    line
        begins 

所以即使是unix,在原始模式下,也需要CR+LF来终止行。隐含CR在LF是unix发明之前,可能是作为一种经济手段,因为它节省了每行一个字节。

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

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

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

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

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

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

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

在某些情况下,您可能不想在返回回车时换行,例如,如果要用短划线删除字符(您只需覆盖它)。

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

来自维基百科:

CR+LF序列在许多早期的计算机系统中普遍使用,这些系统采用电传打字机(通常是ASR33)作为控制台设备,因为这个序列是将这些打印机定位在新线路的起点所必需的。

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

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

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

有趣的是,维基百科上关于";Newline";,声称Windows 8可能会对仅使用LF进行更改。

最新更新