我想知道两者之间的区别(如果可能的话,请举例说明) CR LF (Windows)、LF (Unix)和CR (Macintosh)三种换行类型。


当前回答

基于ASCII或a的系统 兼容字符集使用任意LF (换行,0x0A, 10 十进制)或CR(回车,0x0D,十进制13) 单独,或CR后面跟着 LF (CR+LF, 0x0D 0x0A); 这些字符基于打印机命令:换行 表示了一行 纸张应从打印机中送出,并有一个马车返回 显示打印机 回车应返回到当前行的开头。

这是细节。

其他回答

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

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

But once upon a time this wasn't exactly true. Applications built-in control characters and device-specific processing. The brain-dead systems that required both CR and LF simply had no abstraction for record separators or line terminators. The CR was necessary in order to get the teletype or video display to return to column one and the LF (today, NL, same code) was necessary to get it to advance to the next line. I guess the idea of doing something other than dumping the raw data to the device was too complex.

Unix和Mac实际上为行尾指定了一个抽象,想象一下。遗憾的是,他们指定的是不同的。(Unix,咳咳,是先出现的。)当然,他们使用的控制代码已经“接近”于S.O.P.

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

既然没有这样的答案,我就简单地总结一下:

回车(MAC pre-OSX)

CR 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

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

回车符(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和其他操作系统)中用作新行字符。

NL源自EBCDIC NL = x'15',这将在逻辑上与CRLF x'odoa ascii进行比较…当将数据从大型机物理移动到中端时,这一点变得非常明显。口头上(只有奥术人士才会使用缩略语),NL已经等同于CR或LF或CRLF

CR和LF是一组特殊的字符,帮助我们格式化代码。

CR(/r)代表回车。它将光标放在一行的开头,但不创建新行。这就是MAC OS的工作原理。 LF(/n)表示换行。它创建了一个新行,但没有把光标放在该行的开头。光标停留在最后一行的末尾。这就是Unix和Linux的工作原理。 CRLF (/r/f)创建新行,并将光标放在新行开头。这就是我们在Windows操作系统中看到的情况。

Git默认使用LF。所以当我们在Windows上使用Git时,它会抛出一个警告,比如“CRLF将被LF取代”,并自动将所有CRLF转换为LF,这样代码就变得兼容了。 注意:别担心…不要把这看作是一个警告,而要把它看作是一个提醒。