linux cr换行符,回车符CR和换行符LF

本文详细解释了LF和CRLF两种换行符的区别及其在Windows和类Unix系统中的表现。探讨了为何在不同操作系统中使用不同的换行符标准,以及这如何影响代码编辑和版本控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我在Windows电脑上做开发时,经常会见到这个现象。代码从远程git仓库clone下来后,然后npm install安装依赖后,打开任意一个代码文件会看到每行结尾处有如下报红:

cf7b2ff07bf3d6688d538f9eb79c0a05.png

将鼠标指针停留在行尾报红处,会浮出如下提示:

a8a4762482916e2636a4bdd7ac68054f.png

Expected linebreaks to be 'LF' but found 'CRLF'.eslint(linebreak-style)

字面意思很清楚:期望换行是'LF',但发现是'CRLF'。(eslint换行风格)

但LF和CRLF是什么东西呢?为什么会报红?为什么在MacOS上不会报红?这个代码规范问题又该如何解决呢?好了下面就是我追究的结论。

回车符和换行符是两个不同的字符。

回车符(CR:carriage return),字符编码为:十六进制0D,十进制13,转义字符为'\r';

换行符(LF:line feed),字符编码为:十六进制0A,十进制10,转义字符为'\n'。

在Windows系统中的文本文件按Enter键换行,人眼看到编辑中只是换行了,但在文件二进制存储中实际上是两个字符(CRLF)。在类Unix系统(Unix、Linux、MacOS)中,文本文件按Enter键换行,这个换行在文件二进制存储中是一个字符(LF)。简言之,在Windows系统中换行默认是回车换行(CRLF)两个字符,在类Unix系统中换行默认是换行符(LF)一个字符。

【注:Mac OS 9 以及之前的系统的换行符是 CR,从 Mac OS X (后来改名为“OS X”)开始的换行符是 LF即‘\n',和Unix/Linux统一了。】

我们来验证一下,在Windows系统中创建一个纯文本文件,并用记事本NotePad打开并输入如下内容,用Enter键来换行:

66c664e49f32bea8b8547ce268ba3245.png

bf3c084ceb6261c037cb3beef8bc400e.png

6afe247d8cb1f2b8c37bb0c723d0e2a5.png

我们看到文件大小是8字节,一共六个可见的字符(123abc),每个占一个字节,还有两个字符从何而来呢?

我们用UltraEdit编辑器,打开这个文件,并用十六进制模式查看文件二进制数据:

106fcc3ed36994713dd9531f0f6a8998.png

如上图所见,123和abc之间有个两个字符,十六进制编码分别为:0D、0A,0D是回车符,0A是换行符。

上面文件的字符编码格式是GBK的,我们用VS Code建一个utf-8的文件再试试:

725dba8a7606ada1302be58950e13ff6.png

可以看到文件换行默认采用CRLF,然后再用UltraEdit查看这个html文件的二进制数据:

7399125f6c8698ed86d5c9c2b9e58dff.png

可以看到所有换行处也都是CRLF两个字符,也就是说回车换行两个字符的二进制编码在不同编码方式下是相同的,都是0D和0A。

我们把上面CRLF in Windows.txt文件用VSCode打开,并将换行方式由CRLF改为LF:

44c2225083bcfa34e925fd179b12fe30.png

然后保存文件:

c5032c728d904cb328836da8f0da1a1f.png

再用UltraEdit打开文件,并查看二进制数据:

618ec85418e9de75cd113202ec4b75a2.png

可以看到换行处只有一个字符0A,即换行符。

再看文件大小:

212903c10ff7a5ff399412b068ad0fc9.png

大小从之前的8字节变为7字节,也证明确实少了一个字节,少了的便是0D回车符。

这时我们再次用记事本NotePad打开这个文件:

6c35791c0f41289f51cc69c7395390dd.png

可以看到abc没有换行,这再次证明,在Windows系统中要达到换行的效果,是需要回车和换行两个字符的。只有一个LF换行符,在最简单没有任何格式的编辑器(例如记事本)中是不会换行的,至于在一些比较专业化的程序代码编辑器中会换行,那只是编辑器的视觉优化,即见到0A这个字符(LF换行符)会显示成换行的效果。我们经常下载一些程序代码文件,用记事本打开发现没有换行,但用程序代码编辑器或强大的IDE中打开是正常换行的。这就是其中的原因。

然后再看下在Mac OS中如何,我们新建一个txt纯文本文件:

68133331e699b2d8f6857f5062807b36.png

写入如下内容保存:

7781b08674dd4ca04903228f730522e2.png

用UltraEdit打开此文件,并查看二进制数据:

8c87a42352c30594c26d3aa2274d599a.png

可以看到换行处只有个字符0A换行符。

如果把换行规则改CRLF,文件的大小编程8字节:

8171568474018f87028b2fe5b76e1b13.png

在中断中运行:

vi -b CRLFinMacOS.txt

2d3a2b195193fc978bf738eb1c552c56.png

可以看到行尾有个 ^M,然后shit + :后再运行:

%!xxd

看到二进制数据中又出现了0D和0A,再次验证上面所说结论。

d3653e43fc2a9b794975e058788f59b6.png

改天试一下在Linux上如何。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值