我了解两者之间的区别,因此无需赘述,但我只是想知道Windows为什么同时使用CR和LF来指示换行的背后原因是什么。看起来Linux方法(仅使用LF)更有意义,节省空间并且更易于解析。
我了解两者之间的区别,因此无需赘述,但我只是想知道Windows为什么同时使用CR和LF来指示换行的背后原因是什么。看起来Linux方法(仅使用LF)更有意义,节省空间并且更易于解析。
Answers:
@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的名称更改为“换行符”,因此混乱程度进一步提高了。
由于实际页面不再可用,因此我已将第二个链接更改为The Wayback Machine中的快照。
我希望这回答了你的问题。
我已经看到一个以上的解释,即发送两个字符(有时更多)而不是一个字符的原因是为了使数据传输速率与物理打印速率更好地匹配(这是很久以前的事情了)。移动打印头要比打印单个字符花费更多的时间,并且发送额外的字符是防止数据传输超前打印设备的一种方式。因此,在Windows中我们使用多个字符作为行尾的原因与我们使用QWERTY键盘的原因基本相同-旨在减慢速度。
显然,这种做法在Windows中一直持续到今天的原因是基于一些持续进行的向后兼容性的概念,最终只是简单的惯性。
但是,值得注意的是,Windows并没有在操作系统级别严格执行此约定。任何Windows应用程序都可以随意忽略该约定,具体取决于它尝试与哪些其他应用程序兼容。
有趣的是,维基百科有关“ Newline”的文章声称Windows 8可能会引入仅使用LF的更改。文章还指出,Mac OS X引入了从LF + CR到仅LF的过渡。