回车和换行的区别

以前一直以为,回车就是换行,但是今天因为在使用WSL的时候突然想通了两者的区别,所以写篇简短的博客记录下。

为了区别,我们平时说的回车键,在下面统一使用Enter键代替。且下面的内容只是默认的情况下,完全可以根据软件或者配置一些设置修改。

首先从简单的开始,换行顾名思义,还是很好理解的,就是从一行到另外一行的切换,它的英文是”Line Feed”,简写做LF,其中的feed有”移动”之意。

难以理解的是回车,它的英文是”Carriage Return”,简写为CR。妈耶这个词从字面上是真的难以跟计算机扯上关系….以下的内容引自维基百科:

最早,在打字机上的打字位置是固定的,归位兼换行的扳手用于将承载装纸滚筒的机架(carriage)移到最右边,以便令印字位置对准一行的开头,同时顺便转动滚筒,换至下一行。后来,当打字机的滚筒不再横向移动,改由承载印字头的字车(印字头carriage)移回到本行的起始位置。

从上面的描述可以得出一个结论,回车仅仅是回到一行的起始,所以如果继续输入会覆盖掉原来的内容。

所以如果要写一篇文档,当写到一行的最后的时候,肯定是需要先回车,让光标回到一行的开始,然后再进行换行,这两个操作合二为一,就是现在键盘上的Enter键的作用。

如果所有的系统都是这么想的就好了,事实却不是这样的。

Unix类的系统认为,加一个换行符就足够了,因为你都换到新的一行了,肯定是会回到开始的呀,所以类似1\n2\n3就可以在第一行写上1,第二行写上2,第三行写上3。

Windows则不那么认为,它就死死的认为,需要先回到一行的开始,然后再换行,这样才对嘛,所以在windows中上面的例子就变成了1\r\n2\r\n3

举个例子,我在windows下创建了一个叫test.txt的文件,然后输入方式就是按下1,按下enter键,按下2,按下enter键,最后输入3,退出保存。那么这个文件在linux下可以通过cat -A test.txt来查看。

结果如下所示:

1567416281343

如果在linux下用vim编辑的话,结果如下:

1567425101010

最后是如果在MacOS中用默认的文本编辑器打开,结果是这样的:

QQ图片20190903094133

如果用vim进行编辑的话,结果是这样的:

QQ图片20190903094213

所以总结一下就是:

  • 在windows中,当你在键盘上敲下Enter的时候,系统是帮你加上\r\n
  • 而在unix like的系统上,则是只有一个\n。部分网站上说MacOS上面是加上\r,但是和我实验有出入。

所以如果你把linux下面的文件拿到win上面,然后用记事本打开,你会发现它根本就没有换行(其实主要取决于不同软件对\n的识别,如果用sublime打开你会发现文件正确换行了,而且最后多了一个空行),而把windows下面的文件拿到linux下面则可能会提示有^M错误。当然解决方式很简单,仅仅需要dos2unix或者unix2dos即可。

如果你在使用Git的时候,可能会出现如下的提示:

1567475838124

意思就是LF(即\n)会被CRLF(即\r\n)代替。出现这个的问题主要是在windows下,工作区的文件都是CRLF,而在暂存区则是LF,我的编辑器目前是在windows下运行但是它的换行符是\n,所以会有警告。但是你原来的文件完全不受影响,所以其实是一个无关紧要的提醒而已。