CRLF、CR、LF详解

CRLF、CR、LF详解

 

很长一段时间里,对于CRLF、CR、LF的理解仅限于不同操作系统下对换行符的定义。所谓知其然需知其所以然,从学习中找到乐趣,对知识的记忆才会更加深刻。

名词解释

  • CR:Carriage Return,对应ASCII中转义字符\r,表示回车
  • LF:Linefeed,对应ASCII中转义字符\n,表示换行
  • CRLF:Carriage Return & Linefeed,\r\n,表示回车并换行

众所周知,Windows操作系统采用两个字符来进行换行,即CRLF;Unix/Linux/Mac OS X操作系统采用单个字符LF来进行换行;另外,MacIntosh操作系统(即早期的Mac操作系统)采用单个字符CR来进行换行。

野史

CRLF、CR、LF详解_第1张图片

老式机械打字机(来源:视觉中国)

据野史记载,在很久以前的机械打字机时代,CR和LF分别具有不同的作用:LF会将打印纸张上移一行位置,但是保持当前打字的水平位置不变;CR则会将“Carriage”(打字机上的滚动托架)滚回到打印纸张的最左侧,但是保持当前打字的垂直位置不变,即还是在同一行。

当CR和LF组合使用时,则会将打印纸张上移一行,且下一个打字位置将回到该行的最左侧,也就是我们今天所理解的换行操作。

随着时间的推移,机械打字机渐渐地退出了历史舞台,当初的纸张变成了今天的显示器,打字机的按键也演变为了如今的键盘。在操作系统出现的年代,受限于内存和软盘空间的不足,一些操作系统的设计者决定采用单个字符来表示换行符,如Unix的LF、MacIntosh的CR。他们的意图都是为了进行换行操作,只是当初并没有一个国际标准(或者其他原因,鬼知道),所以才有这样字符上的不同。

结论

许多现代的文本编辑器和命令行工具都提供了可选择的换行符配置,方便用户按照自己的意愿来改变换行符的表现形式,所以我们只需要知道CRLF、CR、LF的作用即可。

参考文献

http://en.wikipedia.org/wiki/Newline
https://en.wikipedia.org/wiki/Control_character
https://stackoverflow.com/questions/1552749/difference-between-cr-lf-lf-and-cr-line-break-types

https://www.jianshu.com/p/b03ad01acd69

 

 

cr和lf是分别编码的控制字符。0x0D(小数13)及0x0A(小数10)。

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

一种虚构的历史观:

如彼得所示,CR=回程和LF=线路进给,两种表达方式都源于旧打字机/TTY。LF将纸张向上移动(但水平位置保持相同),CR将返回“回车”,以便下一个输入的字符位于纸张上最左边的位置(但在同一行上)。CR+LF正在做这两件事,即准备输入一个新行。随着时间的推移,这些代码的物理语义是不适用的,而且由于内存和软盘空间非常昂贵,一些OS设计人员决定只使用其中一个字符,只是彼此之间的通信不太好;-)

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

 

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

载运返回(CR)字符(0x0D\r)将光标移动到行的开头,而不前进到下一行。这个字符被用作商品和早期Macintosh操作系统(OS-9及更早版本)中的新行字符。

行馈(LF)字符(0x0A\n)将光标向下移动到下一行,而不返回行的开头。此字符用于UNIX系统(Linux、MacOSX等)中的新行字符。

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

你可能感兴趣的:(DEV)