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
是转义字符\r
和LF
是转义字符\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区别的主要内容,如果未能解决你的问题,请参考以下文章