回车和换行的来源:\n,\r,\r\n

1. 概念

回车(Carriage Return,CR)换行(Line Feed,LF) 都源于早期的机械打字机和打印机,它们的名字和功能都是从这些设备中继承下来的。它们在计算机系统中的使用,特别是在文本文件的格式中,依然保留了这些历史的遗产。

回车(Carriage Return, CR)

  • 来源:回车原本是打字机上的一个动作,意味着将 打字机的打印头(字车) 移动回到行的起始位置。
  • 历史:在老式打字机中,打字头(或打印头)每打一行就需要返回到行首,这就是 “回车” 的动作。打字机的字车往返时会发出“回车”的声音。
  • 功能:它将打印头移到行首,但不换到下一行。

换行(Line Feed, LF)

  • 来源:换行的动作原本指的是将 纸张向上推进一行,使得打印机或打字机能开始打印下一行。
  • 历史:在老式打印机或打字机中,换行通常意味着纸张向上移动一行,准备打印新的一行。
  • 功能:它会将纸张向上推进一行,从而开始打印下一行。

2. \r\n 的来源

符号        ASCII码      意义
\n           10         换行
\r           13         回车

Teletype Model 33 是一种老式的电传打字机,能够通过电信网络传输文本,但其打印速度和结构上存在一些局限。由于其每秒只能打印有限数量的字符,而在打印一行之后需要做出回车和换行操作来准备打印下一行,这个过程会消耗一定的时间——通常是 0.2 秒

0.2 秒的空闲时间 其实是一个瓶颈。如果在这段时间内新的字符到达,电传打字机就来不及处理,会导致字符丢失。为了避免这个问题,解决方案是将两个特殊的字符(\r\n)发送到设备:

  1. 回车(Carriage Return,CR):这个命令会让打印头回到行首。
  2. 换行(Line Feed,LF):这个命令会使纸张向下移动一行。

通过这种方式,电传打字机能够避免在两行之间出现丢失字符的情况。因为这两个字符的动作是独立进行的,所以可以在回车和换行之间接收新的字符,而不影响输出。

现代计算机也继承了这两个动作。\r 是回车,\n 是换行,前者使光标到行首,后者使光标下移一格。两个加起来 \r\n 就是既回车()又换行。通常用的 Enter 是两个加起来(你可以试一试你键盘的 Enter 键)。

3. \r\n 分家

通过上一节我们可以知道,最开始 \r\n 是组合在一起发送的。

不过,后来现代计算机发明了,这两个概念也就被搬到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。

  • Windows:使用 回车(CR)换行(LF) 组合,即 CRLF\r\n),表示一个新行。
  • Unix/Linux:只使用 换行(LF),即 LF\n)。
  • Macintosh(旧版):使用 回车(CR),即 CR\r)。

MS-DOS(Disk Operating System)Windows 的前身,作为一个基于字符界面的操作系统,它继承了许多来自早期打字机和电传打字机(Teletype)的设计,包括 CRLF 作为行结束标志。

MS-DOS 中,和很多早期操作系统一样,回车(CR)换行(LF) 是用来表示换行的。当你按下“Enter”键时,系统会发送 CRLF,即先回到行首(CR),再跳到下一行(LF)。

MS-DOS 为了与早期的电传打字机和其他硬件设备兼容,采用了回车和换行的组合。这种做法确保了在这些设备上文本能够正确显示和打印。

这一兼容性设计被继承到了 Windows,因此即使在后来的图形界面时代,Windows 系统仍然保留了这种格式。

Windows 95 等版本发布时,MS-DOS 的内核依然对文件系统和命令行操作有很大的影响。Windows 系统的文件格式仍然使用 CRLF 来标识一行的结束,这种设计习惯就沿用下来。

在跨平台的开发和文件交换中,Windows 的 CRLF 与 Unix/Linux 系统的 LF 之间的差异也产生了许多问题。因此,许多工具和库(例如 dos2unix)被开发出来,用于在不同操作系统之间转换文件格式。

posted @ 2025-05-25 18:40  光風霽月  阅读(99)  评论(0)    收藏  举报