957

我想知道 CR LF (Windows)、LF (Unix) 和 CR (Macintosh) 换行符类型之间的区别(如果可能,请提供示例)。

4

9 回答 9

915

CR 和 LF 是控制字符,分别编码0x0D(十进制 13)和0x0A(十进制 10)。

它们用于标记文本文件中的换行符。正如您所指出的,Windows 使用两个字符 CR LF 序列;Unix 只使用 LF,而旧的 MacOS(pre-OSX MacIntosh)使用 CR。

一个杜撰的历史观点:

正如 Peter 所指出的,CR =回车和 LF = 换,这两个表达式起源于旧打字机/TTY。LF 将纸张向上移动(但保持水平位置相同),CR 带回“马车”,以便下一个键入的字符位于纸张的最左侧(但在同一行)。CR+LF 两者都做,即准备键入一个新行。随着时间的流逝,代码的物理语义已不适用,并且由于内存和软盘空间非常宝贵,一些操作系统设计人员决定只使用其中一个字符,但它们之间的交流不太好; -)

大多数现代文本编辑器和面向文本的应用程序都提供选项/设置等,允许自动检测文件的行尾约定并相应地显示它。

于 2009-10-12T04:52:45.153 回答
547

这是我发现的一个很好的总结:

回车 (CR) 字符 ( 0x0D, \r) 将光标移动到行首而不前进到下一行。此字符在 Commodore 和早期 Macintosh 操作系统(OS-9 和更早版本)中用作换行符。

换行(LF) 字符 ( 0x0A, \n) 将光标向下移动到下一行,而不返回到行首。此字符在基于 UNIX 的系统(Linux、Mac OSX 等)中用作换行符

行尾 (EOL) 序列 ( 0x0D 0x0A, \r\n) 实际上是两个 ASCII 字符,即 CR 和 LF 字符的组合。它将光标向下移动到下一行和该行的开头。该字符在大多数其他非 Unix 操作系统(包括 Microsoft Windows、Symbian OS 等)中用作换行符。

来源

于 2009-10-12T04:54:26.040 回答
440

这实际上只是关于哪些字节存储在文件中。CR是用于回车(从打字机时代开始)和LF换行的字节码。它只是指作为行尾标记放置的字节。

与往常一样,在维基百科上提供更多信息。

于 2009-10-12T04:52:29.337 回答
211

由于没有答案说明这一点,因此简明扼要地总结:

回车(MAC pre-OSX)

  • \r
  • ASCII 码 13

换行(Linux、MAC OSX)

  • 如果
  • \n
  • ASCII 码 10

回车和换行(Windows)

  • CRLF
  • \r\n
  • ASCII 码 13,然后是 ASCII 码 10

如果您看到奇怪格式的 ASCII 代码,它们只是不同基数/基数的数字 13 和 10,通常是基数 8(八进制)或基数 16(十六进制)。

http://www.bluesock.org/~willg/dev/ascii.html

于 2016-08-31T22:07:53.050 回答
52

杰夫阿特伍德最近有一篇关于此的博客文章: 大新线分裂

这是维基百科的精髓:

CR+LF 序列在许多采用电传打字机(通常是 ASR33)作为控制台设备的早期计算机系统上普遍使用,因为需要该序列来将这些打印机定位在新行的开头。在这些系统上,通常会编写文本以与这些打印机兼容,因为设备驱动程序对应用程序隐藏此类硬件细节的概念尚未得到很好的发展。应用程序必须直接与电传打字机对话并遵循其约定。这两个功能的分离掩盖了打印头无法在一个字符时间内从最右边返回到下一行开头的事实。这就是为什么序列总是首先与 CR 一起发送的原因。事实上,通常需要发送额外的字符(无关的 CR 或 NUL,它们会被忽略)以使打印头有时间移动到左边距。即使在电传打字机被具有更高波特率的计算机终端取代之后,许多操作系统仍然支持这些填充字符的自动发送,以与需要多个字符时间来滚动显示的廉价终端兼容。

于 2010-01-20T19:53:59.513 回答
17

CR - ASCII 码 13

LF - ASCII 码 10。

理论上 CR 会将光标返回到第一个位置(左侧)。LF 馈送一行移动光标向下一行。这就是您在过去控制打印机和文本模式监视器的方式。这些字符通常用于标记文本文件中的行尾。不同的操作系统使用不同的约定。正如您所指出的,Windows 使用 CR/LF 组合,而 OSX 之前的 Mac 仅使用 CR 等等。

于 2009-10-12T04:55:00.687 回答
7

基于 ASCII 或兼容字符集的系统单独使用 LF(换行,0x0A,十进制 10)或 CR(回车,0x0D,十进制 13),或 CR 后跟 LF(CR+LF,0x0D 0x0A);这些字符基于打印机命令:换行表示应将一行纸送出打印机,回车表示打印机回车应返回到当前行的开头。

这是详细信息

于 2009-10-12T04:52:50.190 回答
7

“记录分隔符”或“行终止符”的可悲状态是计算黑暗时代的遗产。

现在,我们理所当然地认为,我们想要表示的任何东西在某种程度上都是结构化数据,并且符合定义行、文件、协议、消息、标记等的各种抽象。

但曾几何时,这并不完全正确。应用程序内置控制字符和设备特定处理。需要 CR 和 LF 的脑死亡系统根本没有对记录分隔符或行终止符的抽象。为了让电传打字机或视频显示返回到第一列,CR 是必要的,而 LF(今天,NL,相同的代码)对于让它前进到下一行是必要的。我想除了将原始数据转储到设备之外,做其他事情的想法太复杂了。

Unix 和 Mac 实际上为行尾指定了一个抽象,想象一下。可悲的是,他们指定了不同的。(Unix,咳咳,第一个出现。)自然而然,他们使用了一个已经“接近” SOP 的控制代码

由于我们今天几乎所有的操作软件都是 Unix、Mac 或 MS 操作 SW 的后代,因此我们陷入了行尾混乱。

于 2009-10-12T05:10:54.027 回答
1

从 EBCDIC NL = x'15' 派生的 NL 在逻辑上与 CRLF x'odoa ascii 进行比较......当将数据从大型机物理移动到中端时,这一点变得很明显。通俗地说(因为只有神秘的人使用 ebcdic)NL 等同于 CR 或 LF 或 CRLF

于 2017-06-16T00:45:25.743 回答