我理解两者之间的区别,所以没有必要进入,但我只是想知道为什么Windows使用CR和LF来表示换行的原因是什么。看起来Linux方法(只使用LF)更有意义,节省空间,更容易解析。
答案 0 :(得分:77)
历史上,当使用点阵式打印机 电传类型时,CR会将托架返回到该行的第一个位置,而LF将返回到下一行。在文件中使用CR + LF可以直接将文件发送到打印机,而无需任何类型的打印机驱动程序。
感谢@zaph指出它是电传而非点阵打印机
答案 1 :(得分:20)
@sshannin发布了Raymond Chen博客的网址,但它不再有用了。博客已更改其内部软件,因此URL已更改。
在浏览新博客中的旧帖子后,我发现它here。
来自博客的引用:
为什么行终止符CR + LF?
这个协议可以追溯到电传打字机的时代。 CR代表 对于“回车” - CR控制字符返回打印 在没有推进纸张的情况下将头部(“托架”)放到第0列。 LF站着 对于“换行” - LF控制字符使纸张前进一行 没有移动打印头。所以如果你想要退回印刷品 前往零列(准备打印下一行)并推进 纸(所以它在新纸上打印),你需要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选项,你会看到onlcr选项指定是否 LF应该改为CR + LF。如果你错误地设置了这个设置,那么你 得到stairstep文本,其中
每个
线
开始
上一行停止的地方。因此,即使是unix,当处于原始模式时,也需要CR + LF来终止线路。隐含的CR 之前LF是一个unix发明,可能作为一个经济体,因为它节省了 每行一个字节。
C语言的unix祖先将此约定带入C语言 语言标准,只需要“\ n”(编码LF) 终止行,将负担放在运行时库上 将原始文件数据转换为逻辑行。
C语言还引入了术语“换行符”来表达 “通用线路终结器”的概念。我被告知ASCII 委员会在1996年左右将字符0x0A的名称改为“换行符”, 所以混乱程度已经提高了。
Here’s another discussion of the subject, from a unix perspective
我已将第二个链接更改为Wayback Machine中的快照,因为实际页面不再可用。
我希望这能回答你的问题。
答案 2 :(得分:15)
它来自昔日的电传打字机(和打字机)。
以前,当你输入一行时,你必须将打字机的托架(它固定纸张并在键入时向左滑动)移回到行首(CR)。然后,您必须将纸张向前推进(LF)以移动到下一行。
有些情况下,您可能不希望在返回马车时换行,例如,如果您要用短划线删除一个字符(您只是覆盖它)。
但基本上,它归结为惯例。 DOS使用完整的CR / LF约定,UNIX缩短了一点。现在我们被困住了!
答案 3 :(得分:1)
我看过不止一个帐户,因为发送两个字符(有时更多)而不是一个字符的原因是为了更好地匹配数据传输速率与物理打印速率(这是一个很久以前)。移动打印头比打印单个字符花费的时间更长,发送额外字符是防止数据传输超出打印设备的一种方法。因此,我们在Windows中使用多个字符作为行尾的原因与我们使用QWERTY键盘的原因基本相同 - 它旨在减慢速度。
显然,这种做法在Windows中持续到今天的原因是基于一些持续向后兼容性的概念,最终只是简单的惯性。
但值得注意的是, Windows在操作系统级别并未严格执行此约定。任何Windows应用程序都可以自由地忽略约定,具体取决于它尝试与之兼容的其他应用程序。
有趣的是,Wikipedia article about "Newline"声称Windows 8可能会引入仅使用LF的更改。文章还指出,Mac OS X引入了从LF + CR到LF的过渡。
答案 4 :(得分:1)
其他人给出了答案,但我想补充一下......我猜你太年轻了,不能使用打字机? ;) 马车是一个鼓。水平向右移动,将固定型头部带回页面的左边缘。用手指和拇指旋转托架使页面前进一行。
答案 5 :(得分:0)
来自Wikipedia:
序列CR + LF在许多采用电传打字机(通常是ASR33)作为控制台设备的早期计算机系统中普遍使用,因为需要这一序列来将这些打印机放置在新线的开头。< / p>