\r 、\n 和 CR、LF 详解

\r(即 CR,Carriage Return)表示回车,使光标到行首; \n(即 LF,Linefeed)表示换行,使光标下移一格。CRLF 表示 Carriage Return & Linefeed(\r\n),表示回车并换行。键盘上的 Enter 键就是这两个字符的组合效果。

微软的 MS-DOS/Windows 操作系统采用 \r\n 这两个字符来实现文本换行效果,Unix/Linux 操作系统采用单个字符 \n 来实现文本换行效果,而 Mac 操作系统采用单个字符 \r 来实现文本换行效果

\r\n 是 Windows 所使用的文本行结束标签,使用正则表达式 \r\n\r\n 进行的搜索将匹配两个连续的行尾,而那正是两行文本之间的空白行。在 Unix/Linux 系统上匹配空白行只使用 \n\n 即可,不需要加上 \r。同时适用于 Windows 和 Unix/Linux 系统的正则表达式应该包含一个可选的 \r 和一个必须被匹配的 \n

在很久以前的机械打字机(如下图所示)时代,CR 和 LF 分别具有不同的作用:LF 会将打印纸张上移一行位置,但是保持当前打字的水平位置不变,而 CR 则会将 Carriage (即打字机上的滚动托架)滚回到打印纸张的最左侧,但是保持当前打字的垂直位置不变,即还是在同一行。机械式电传机结构复杂,维修不便,工作速率低,噪声大,后来被电传打印机所取代。

2Fe4dde71190ef76c627ab32729216fdfaaf51676a.jpeg

CR 命令和 LF 命令是在计算机终端还是电传打印机(如下图所示)的时候遗留下来的东西。在计算机还没有出现之 前,有一种叫做电传打字机(Teletype Model 33,Linux/Unix 下的 tty 概念也来自于此)。电传打字机就像机械打字机一样工作,它每秒钟可以打 10 个字符,但是有一个问题,就是打完一行换行的时候,要用去 0.2 秒,正好可以打两个字符,如果在这 0.2 秒内有新的字符传过来,那么这两个字符将丢失。于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符:一个叫做回车(return),告诉打字机把打印头回到左边;另一个叫做换行(newline),告诉打字机把纸向下移一行。这就是换行和回车的来历,从它们的英语名字上也可以看出一二。

2690ae259a04ceb5f22b2f490bb312be_720w.jpg

虽然使用卷纸的终端时代已经过去了,但是,CR 和 LF 命令依然存在,许多应用程序和网络协议仍使用这些命令作为分隔符。

在 Linux 下,命令 unix2dos 是把 Linux 的文本换行格式转换成 Windows 的文本换行格式,命令 dos2unix 则是把 Windows 文本换行格式转换成 Linux 文件格式。

在不同换行格式的操作系统之间使用 FTP 软件传送文本文件时,一些 FTP 客户端程序在 ascii 文本模式传输模式下会自动对换行格式进行转换,经过这种传输的文件字节数可能会发生变化。如果你不想让 FTP 程序修改原文件, 可以使用 bin 模式(二进制模式)传输文本。一个程序在 Windows 上运行就生成 CRLF 换行格式的文本文件,而在 Linux 上运行就生成 LF 换行格式的文本文件。比如编程常用的版本控制工具 Git,就可以实现在 Windows 上将换行符表示为 \r\n,当把代码的文本文件上传到 Git 的远程 Linux 服务器后就自动转换为以 \n 为换行。

CRLF 可被用于攻击。攻击者可以通过在一段数据中加入 CRLF 命令来改变接受这个数据的应用程序处理这个数据的方式,从而执行 CRLF 注入攻击。

你可能感兴趣的:(\r 、\n 和 CR、LF 详解)