换行符 CRLF 的历史与演变

换行符 CRLF 的历史与演变

•约 1.9 千字

我们每天都在使用文本文件。它的换行看似简单,背后却隐藏着一段跨越百年的通信和计算机历史。从早期的电报机到现代的网络协议,一个看似微不足道的字符组合 **CRLF(回车和换行)**是如何塑造我们数字世界的?

本文将深入探讨换行符的起源、不同操作系统的选择,以及为什么一个简单的文本文件在不同系统间打开会变乱。

字符基础:ASCII 与换行符的身份

要理解换行,首先要从 **ASCII(美国标准信息交换码)**字符集说起。

ASCII 是基于拉丁字母的编码标准,最初为电报码设计,共定义了 128 个字符。其中,除了我们熟悉的字母、数字和标点符号外,还包括了 33 个 控制字符 「不可见字符」。

在这些控制字符中,有两个关键的成员定义了「换行」的概念:

  • 换行符 (Line Feed, LF):\n,二进制为 0000 1010
  • 回车符 (Carriage Return, CR):\r,二进制为 0000 1101

广义上的「换行」就是 LF (\n),但为什么会出现 CR (\r) 呢?答案要追溯到计算机诞生之前。

CRLF 的起源:电传打字机的机械记忆

CRLF 「即 \r\n 的组合」的诞生直接源于一种古老的通信设备 —— 电传打字机 Teletype。

1. 电报时代的通信革新

19 世纪末至 20 世纪初,电传打字机成为重要的通信工具。最初它们使用摩尔斯电码,但随着技术的进步,埃米尔·鲍多 (Emile Baudot) 发明的鲍多码(后发展为 ITA2)实现了更高效的文本传输。

2. 机械结构的必然性

1901 年,**唐纳德·默里 (Donald Murray)**对鲍多码进行了改进,引入了后来标准化为 ITA2 的默里码,并在其中加入了 CR 和 LF 这两个格式控制字符。

在电传打字机上:

  • 回车符(CR): 机械功能是将打印头 (Carriage) 移动到当前行的最左边 也就是回到行首
  • 换行符(LF): 机械功能是将纸张向上移动一行,送纸

为什么要组合使用?

电传打字机的打印头从行尾返回到行首是一个机械动作,需要消耗约 0.2 秒的时间。如果只发送一个 LF,纸张虽然向上移动了,但打印头仍在行尾。紧接着发送的下一个字符就会在纸张中间打印出来,造成字符重叠或数据丢失。

因此,CRLF (\r\n) 组合被设计用来解决这个机械延迟问题:先通过 CR 将打印头移回行首,再通过 LF 移动到下一行,确保下一个字符能够在新行的开头正确打印。为了给打印头争取更多回位时间,有时甚至需要在 CRLF 之后发送额外的 NUL 或 CR 字符。

操作系统的分歧:昂贵的存储与兼容性

随着计算机的出现,电传打字机常作为早期的控制台输入输出设备。计算机系统也自然继承了 CRLF 的习惯。但随着存储器和处理能力的发展,计算机科学家开始质疑:是否还需要两个字符来表示一个简单的“换行”?

存储器在早期计算机中非常昂贵,每行多一个字符 (\r) 意味着潜在的浪费。

1. 微软/Windows 的选择:兼容性至上

  • 系统: MS-DOS,以及后来的 Windows
  • 选择: CRLF (\r\n)
  • 原因: MS-DOS 为了兼容 CP/M(一个遵循 DEC 小型机标准的老系统),继承了电传打字机和早期终端机使用的 \r\n 约定。Windows 作为 MS-DOS 的后继者,为了保持兼容性,继续沿用了这一标准

2. Unix/Linux 的选择:效率与简化

  • 系统: Multics,后来的 Unix、Linux、Android、iOS、macOS (现代版本)
  • 选择: LF (\n)
  • 原因: 1964 年开始开发的 Multics 以及后来的 Unix 遵循简化设计的理念。它们利用设备驱动程序在需要时「例如发送给实际打印机」将单字节的 LF 转换为所需的序列,如 \r\n。单独使用 LF 既减少了存储开销,也更方便编程

3. macOS 的早期选择:短暂的回车符

  • 系统: 早期 Mac OS(OS 9 及以前)
  • 选择: CR (\r)
  • 原因: 虽然确切原因难以考证,但可能与早期 Apple 设备的自身设计或与其他设备的兼容性考量有关。在 macOS/OS X 时代,苹果已经转向基于 Unix 的设计,因此现在统一使用了 LF (\n)

为什么 macOS/Linux 文件在 Windows 上打开会变坨?

这就是不同操作系统换行符标准冲突的直接后果:

  1. Windows/文本编辑器默认识别 \r\n 作为一个完整的换行操作
  2. macOS/Linux 文件只使用 \n 作为换行标记

当您在 Windows 记事本等老式文本编辑器中打开一个 Unix/Linux 文件时:

  • 编辑器看到了 \n (换行),但没有看到紧随其后的 \r (回车)
  • 它执行了 LF 的动作:光标下移一行。但它没有执行 CR 的动作:光标回到行首
  • 结果就是每一行都从上一行的结束位置继续打印,最终形成一行接一行堆叠在一起的一坨文。

现代的文本编辑器(如 Visual Studio Code、Sublime Text,甚至新版本的 Windows 记事本)已经能够智能识别和处理单独的 \n,因此这个问题在日常使用中正变得越来越少见。

协议中的坚持:CRLF 在网络世界中的地位

尽管现代操作系统已经倾向于使用更简洁的 LF,但在许多网络协议中,CRLF (\r\n) 仍然是金科玉律。

这是为了保持与早期系统和既有规范的兼容性和互操作性。

  • HTTP(超文本传输协议): 在请求头和响应头中,CRLF 用于分隔每一行头部信息,并且必须使用连续的两个 CRLF (\r\n\r\n) 来标记头部信息的结束和请求/响应正文的开始
  • Telnet: 一种远程终端协议,它使用 CRLF 来表示用户的 Enter 键或行结束
  • SMTP(邮件传输协议)和 POP3/IMAP(邮件接收协议): 这些协议在定义邮件头和正文的格式时,也严格遵循 CRLF 的约定

在这些协议中,CRLF 的作用已经从机械控制转变为数据定界符,它清晰地告诉接收方:这一段信息结束了,新的一段或新的一行开始了。

总结:换行符简史

名称符号适用系统/场景演变原因
CRLF\r\nWindows, MS-DOS, HTTP, Telnet继承自电传打字机的机械控制需求。
LF\nUnix, Linux, macOS(现代)、Android、iOS计算机系统简化设计、节约存储空间的产物。
CR\rMac OS(早期)早期 Mac 系统的独特选择,现已废弃。

从电传打字机时代的机械命令,到操作系统间的标准分歧,再到网络协议中的关键定界符,CRLF 的历史充分展示了技术演变中兼容性与效率之间的永恒博弈。

换行符 CRLF 的历史与演变https://aoang.x2ox.com/2024/ascii-crlf/
作者Aoang
发布于2024-12-11
更新于2025-12-11
许可协议CC BY-NC-SA 4.0
转载或引用本文时请遵守许可协议,并注明出处。