我想知道两者之间的区别(如果可能的话,用例子)CR LF(Windows)、LF(Unix)和CR(Macintosh)换行符类型。
CR LF
LF
CR
它实际上只是关于哪些字节存储在文件中。CR是回车的字节码(来自打字机的时代)和LF类似,用于换行。它只是指放置为行尾标记的字节。
更多的信息,一如既往,在wikipedia。
CR和LF是控制字符,分别编码为0x0D(十进制13)和0x0A(十进制10)。
0x0D
0x0A
它们用于标记文本文件中的换行符。正如您所指出的,Windows使用两个字符CR LF序列;Unix仅使用LF,旧的MacOS(OSX之前的MacIntosh)使用CR。
一个虚构的历史视角:
正如彼得所说、CR=回车符号和LF=换行符,这两个表达式的根源都源于旧的打字机/TTY。LF将纸张向上移动(但保持水平位置相同),CR带回了“马车”,这样下一个输入的字符就会在纸张的最左边(但在同一行)。CR+LF同时做了这两件事,即准备打一行新字符。随着时间的推移,代码的物理语义学不适用,并且内存和软盘空间非常宝贵,一些操作系统设计师决定只使用其中一个字符,他们只是彼此之间沟通不好;-)
大多数现代文本编辑器和面向文本的应用程序提供选项/设置等,允许自动检测文件的行尾约定并相应地显示它。
基于ASCII或A的系统兼容字符集使用LF(线路进给,0x0A,10十进制)或CR(回车,0x0D,十进制13)单独,或CR后跟LF(CR+LF,0x0D 0x0A);这些字符基于打印机命令:换行符表明一行纸张应该从打印机输出,并且回车表示打印机回车应该回到当前行的开头。
这里是细节。
这是我发现的一个很好的总结:
回车符号(CR)字符(0x0D,\r)将光标移动到行的开头而不前进到下一行。此字符在Commodore和早期Macintosh操作系统(OS-9及更早版本)中用作新行字符。
\r
换行符(LF)字符(0x0A,\n)将光标向下移动到下一行而不返回行的开头。该字符在基于UNIX的系统(Linux、Mac OSX等)中用作新行字符
\n
行尾(EOL)序列(0x0D 0x0A,\r\n)实际上是两个ASCII字符,CR和LF字符的组合。它将光标向下移动到下一行和该行的开头。该字符在大多数其他非Unix操作系统中用作新行字符,包括Microsoft Windows、Symbian OS等。
0x0D 0x0A
\r\n
来源
CR-ASCII码13
LF-ASCII码10。
理论上CR将光标返回到第一个位置(左侧)。LF提供一行将光标向下移动一行。这就是过去您控制打印机和文本模式监视器的方式。这些字符通常用于标记文本文件中的行尾。不同的操作系统使用不同的约定。正如您指出的,Windows使用CR/LF组合,而OSX之前的Mac仅使用CR等等。
“记录分隔符”或“行终止符”的可悲状态是计算黑暗时代的遗产。
现在,我们想当然地认为,我们想要表示的任何东西在某种程度上都是结构化数据,并且符合定义行、文件、协议、消息、标记等的各种抽象。
但曾几何时,这并不完全正确。应用程序内置控制字符和特定于设备的处理。同时需要CR和LF的脑残系统根本没有记录分隔符或行终止符的抽象。CR是让电传打字或视频显示返回到第一列的必要条件,LF(今天的NL,相同的代码)是让它前进到下一行的必要条件。我想除了将原始数据转储到设备之外做其他事情的想法太复杂了。
Unix和Mac实际上为行尾指定了抽象,想象一下。可悲的是,他们指定了不同的。(Unix,咳,首先出现。)自然地,他们使用了已经“接近”S. O. P的控制代码。
由于我们今天几乎所有的操作软件都是Unix、Mac或MS操作SW的后代,我们被困在行尾混乱中。
杰夫·阿特伍德最近有一篇关于这个的博客文章:伟大的Newline分裂
以下是维基百科的精髓:
CR+LF序列是常用的在许多早期的计算机系统中采用了电传打字机,通常是ASR33,作为控制台设备,因为这个序列是需要将这些打印机定位在一个新系列的开始。在这些系统,文本通常是例行公事组成与这些兼容打印机,因为设备的概念隐藏此类硬件详细信息的驱动程序从应用程序还没有很好开发;应用程序不得不说话直接传送到电传打字机遵循它的惯例。<强>分离这两个函数中的一个隐藏了打印头不能从最右边返回到中的下一行的开头一个字符的时间。这就是为什么序列总是与CR一起发送首先。事实上,它经常是必要的发送额外字符(无关的CR或NULs,它们被忽略)给打印头移动的时间左边缘。即使在电传打字之后被电脑终端取代随着波特率的提高,许多操作系统仍然支持自动发送这些填充字符,对于与更便宜的终端兼容需要多个字符的时间滚动显示。
因为没有答案只说明这一点,简明扼要地总结一下:
回车符号(MAC pre-OSX)
换行符(Linux,MAC OSX)
回车符号和换行符(Windows)
如果您看到ASCII码的格式很奇怪,那么它们只是不同基数/基数中的数字13和10,通常是基数8(八进制)或基数16(十六进制)。
http://www.bluesock.org/~willg/dev/ascii.html
NL源自EBCDIC NL=x'15',这在逻辑上与CRLF x'orda ascii相比较…当物理地将数据从大型机移动到中端时,这一点变得很明显。通俗地说(因为只有神秘的人使用ebcdic)NL被等同于CR或LF或CRLF
CR和LF是一组特殊的字符,有助于格式化我们的代码。
CR(/r)代表回车。它将光标放在一行的开头,但不会创建新行。这就是MAC OS的工作原理。
LF(/n)代表LINE FEED。它创建一个新行,但不将光标放在该行的开头。光标停留在最后一行的末尾。这就是Unix和Linux的工作方式。
CRLF(/r/f)创建一个新行并将光标放在新行的开头。这是我们在Windows操作系统中看到的。
Git默认使用LF。因此,当我们在Windows上使用Git时,它会抛出一个警告,例如-“CRLF将被LF替换”并自动将所有CRLF转换为LF,以便代码变得兼容。不要担心……把这看成是一个警告,更多的是一个通知。