CRLF和LF区别

Posted LiPK

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CRLF和LF区别相关的知识,希望对你有一定的参考价值。

1. CRLF概念

CRLF(Carriage-Return Line-Feed),CR是回车符,LF是换行符。它们都是文本文件用于标记换行的控制字符(control characters)或字节码(bytecode)。

CR(Carriage Return),回车符号,对应字符 \'\\r\',十六进制 ascii 码为 0x0D,十进制 ascii 码为 13,用于将鼠标移动到行首,并不前进至下一行。

LF(Line Feed),换行符号,对应字符 \'\\n\',十六进制 ascii 码为 0x0A,十进制 ascii 码为 10,用于换行。

紧邻的 CR 和 LF(组成 CRLF,\\r\\n,或十六进制 0x0D0A)将鼠标移动到下一行行首。

Windows 操作系统默认的文本换行符为 CRLF;
Linux 以及 macOS 系统默认使用 LF,早期的 mac os 系统使用 CR 换行。

2. Git中配置

由于编辑器的不同或者文件行尾的换行符在 Windows 下被替换了,一些细微的空格变化会不经意地混入提交的补丁或其它协作成果中。 Git 提供了一些配置项来帮助解决这些问题。

core.autocrlf

  • Git 可以在提交时自动地把回车和换行转换成换行,而在检出代码时把换行转换成回车和换行。 可以用 core.autocrlf 来打开此项功能。 如果是在 Windows 系统上,把它设置成 true,这样在检出代码时,换行会被转换成回车和换行:
git config --global core.autocrlf true # 全局设置
git config --local core.autocrlf true # 项目设置
  • 如果使用以换行作为行结束符的 Linux 或 macOS,不需要 Git 在检出文件时进行自动的转换; 然而当一个以回车加换行作为行结束符的文件不小心被引入时,想让 Git 修正。可以把 core.autocrlf 设置成 input 来告诉 Git 在提交时把回车和换行转换成换行,检出时不转换,这样在 Windows 上的检出文件中会保留回车和换行,而在 macOS 和 Linux 上,以及版本库中会保留换行。
git config --global core.autocrlf input
  • 如果正在开发仅运行在 Windows 上的项目,可以设置 false 取消此功能,把回车保留在版本库中:
git config --global core.autocrlf false

一般开发规范:

  • 使用 Windows 系统的开发git config --global core.aurocrlf true
  • 使用Linux/MacOS 的开发git config --global core.autocrlf input

CR LF、LF 和 CR 换行符类型的区别?

【中文标题】CR LF、LF 和 CR 换行符类型的区别?【英文标题】:Difference between CR LF, LF and CR line break types? 【发布时间】:2010-12-05 21:10:28 【问题描述】:

我想知道 CR LF (Windows)、LF (Unix) 和 CR (Macintosh) 换行符类型之间的区别(如果可能,请提供示例)。

【问题讨论】:

非常相似,但不是完全重复。 \n 通常由换行表示,但不一定是换行。 CR 和 LF 是 ASCII 和 Unicode 控制字符,而 \r\n 是某些编程语言中使用的抽象。结束这个问题会掩盖问题之间的根本差异并使错误信息永久化。 @AdrianMcCarthy 在某种程度上,近距离投票作为答案的方式存在问题;声称两者相同的答案可能会被否决,然后以非常非常错误的形式显示为灰色,但只需要 4 票同意票(与赞成票相当)就会发生非常错误的收盘,直到之后才能反驳投票它发生了。 这个问题的提法固然更好,但实际上它仍然是同一个问题。 @JukkaK.Korpela:不,真的不是。 \n 在所有编程语言中的含义并不相同。 【参考方案1】:

CR 和 LF 是控制字符,分别编码为0x0D(十进制13)和0x0A(十进制10)。

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

杜撰的历史观点:

As indicated by Peter, CR = Carriage Return 和 LF = Line Feed,这两个表达式都源于旧打字机/TTY。 LF 将纸张向上移动(但保持水平位置相同),CR 带回“马车”,以便下一个键入的字符位于纸张的最左侧(但在同一行)。 CR+LF 两者都做,即准备输入一个新行。随着时间的推移,代码的物理语义不再适用,并且由于内存和软盘空间非常宝贵,一些操作系统设计人员决定只使用其中一个字符,他们只是不能很好地相互交流; -)

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

【讨论】:

所以实际上 Windows 是唯一正确使用这些字符的操作系统,回车,后跟换行。 如果说在 Windows 上创建的文本文件是三者中最兼容的,即最有可能在所有三个操作系统子集上显示,准确吗? @Hashim 它可能会正确显示,但尝试运行带有回车符的文本 shell 脚本通常会导致错误 简而言之,CR and LF 只是根据此 link 的行尾和换行,这是正确的吗? Rolf - 该声明假定在新技术中保留旧术语/技术是正确的。 CRLF = 2 个字节。 CR = 1,LF = 1。随着使用频率的提高,这实际上转化为大量数据。再一次,Windows 选择了不同于整个 *NIX 世界。【参考方案2】:

这是我找到的一个很好的总结:

回车 (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 等)中用作换行符。

Source

【讨论】:

“垂直制表符”字符将光标向下移动并保持在行中的位置,而不是 LF 字符。 LF 为 EOL。 @TaylorLeese /r/n 和 /n/r 一样吗?【参考方案3】:

这实际上只是关于哪些字节存储在文件中。 CR 是用于回车的字节码(从打字机时代开始),LF 类似地用于换行。它只是指作为行尾标记放置的字节。

一如既往地在wikipedia上提供更多信息。

【讨论】:

我认为提及CR 是转义字符\rLF 是转义字符\n 也很有用。另外,Wikipedia:Newline. 简而言之,CR and LF 只是根据此 link 的行尾和换行,这是正确的吗? @shaijut CR 代表回车。这就是打字机返回马车的原因。所以,大部分是正确的。 令人遗憾的是,高级 LFCR 选项不见了。它的好处是,通过先执行换行,Selectric 高尔夫球在执行回车时不会用仍然新鲜的墨水涂抹刚刚打印的线条【参考方案4】:

由于没有答案说明这一点,简要总结一下:

回车(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

【讨论】:

\r\n 仅适用于某些编程语言,尽管它在使用反斜杠表示特殊字符的编程语言中似乎是通用的。 @Flimm 是的,反斜杠通常是用来“转义”后面的字符。【参考方案5】:

Jeff Atwood 最近有一篇关于此的博文:The Great Newline Schism

这里是Wikipedia的精华:

序列CR+LF是常用的 在许多早期的计算机系统上 采用了电传打字机, 通常是 ASR33,作为控制台 设备,因为这个序列是 需要将这些打印机定位在 新行的开始。在这些上 系统,文本通常是例行公事 组成与这些兼容 打印机,因为设备的概念 隐藏此类硬件细节的驱动程序 从应用程序还不是很好 发达;应用程序不得不说话 直接到电传打字机和 遵循其约定。 分离 这两个功能隐藏了 事实上,打印头不能 从最右边返回 下一行的开头 一个字符的时间。这就是为什么 序列始终与 CR 一起发送 第一的。事实上,这往往是必要的 发送额外的字符(无关的 CR 或 NUL,它们被忽略)到 给打印头时间移动到 左边距。 即使在电传打字之后 被电脑终端取代 具有更高的波特率,许多操作 系统仍然支持自动 发送这些填充字符,对于 与更便宜的终端兼容 需要多个字符时间 滚动显示。

【讨论】:

+1 正是通过这种简单的理解,我始终记得组合的顺序。即使在今天,我们仍然可以在任何喷墨打印机中看到这种机械逻辑(我喜欢理解,因为我讨厌学习)。我的其他记忆技巧是:“mac? Return to sender”和“NewLineFeed”(记住 NL===LF 并记住 \n ,因为 CR 的缩写中已经包含 R) “我很怀疑......计时需要两个控制代码”。这不是它所说的。它说额外的 CR 和 NUL 是为了给它时间回来,而不是原来的 CR LF。 @Adrian 你会参加角色体验吗? 1) 在我以前的电传打字机时代,我们使用的打印机需要<CR><CR><LF> - 所以当然我只尝试了一台<CR>。我在排长队后发送了<CR><LF>A,您可以听到在回车完全返回之前打印A @Adrian 2) 不要忘记,这是在机电时代,每个角色都只执行一个功能。我们经常通过打印一行来强调一个单词,然后发送<CR><CR> 并输入正确数量的空格,然后重新打印同一个单词:粗体的原始形式。 @Adrian 3) 最后,这是使用 Baudot(或 Murray 代码),而不是 ASCII。五个数据位,在一个起始位和一个半停止位之间。怎么可能有半点?在开始发送下一个字符之前等待半位时间,让打印头有时间返回中心。【参考方案6】:

CR - ASCII 码 13

LF - ASCII 码 10。

理论上 CR 会将光标返回到第一个位置(左侧)。 LF 馈送一行移动光标向下一行。这就是您在过去控制打印机和文本模式监视器的方式。 这些字符通常用于标记文本文件中的行尾。 不同的操作系统使用不同的约定。正如您所指出的,Windows 使用 CR/LF 组合,而 OSX 之前的 Mac 仅使用 CR 等等。

【讨论】:

【参考方案7】:

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

这里是details。

【讨论】:

【参考方案8】:

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

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

但从前这并不完全正确。应用程序内置控制字符和设备特定处理。需要 CR 和 LF 的脑死亡系统根本没有对记录分隔符或行终止符的抽象。为了让电传打字机或视频显示返回到第一列,CR 是必要的,而 LF(今天,NL,相同的代码)对于让它前进到下一行是必要的。我想除了将原始数据转储到设备之外,做其他事情的想法太复杂了。

Unix 和 Mac 实际上为行尾指定了一个 抽象,想象一下。可悲的是,他们指定了不同的。 (Unix,咳咳,排在第一位。)当然,他们使用的控制代码已经“接近”了 S.O.P.

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

【讨论】:

【参考方案9】:

从 EBCDIC NL = x'15' 派生的 NL 在逻辑上与 CRLF x'odoa ascii 进行比较...当将数据从大型机物理移动到中端时,这一点变得很明显。通俗地说(因为只有神秘的人使用 ebcdic)NL 被等同于 CR 或 LF 或 CRLF

【讨论】:

以上是关于CRLF和LF区别的主要内容,如果未能解决你的问题,请参考以下文章

CR LF、LF 和 CR 换行符类型的区别?

vscode 中的LF CRLF

IDEA换行CRLF, LF, CR的解释和默认设置

LF CRLF

git LF 和 CRLF换行的问题

git LF 和 CRLF换行的问题