回车符、换行符

来自GSXAB的知识库
回车
术语名称 回车
英语名称 carriage return
别名 CR, \r
换行
术语名称 换行
英语名称 line feed
别名 LF, new line, NL, end of line, EOL, \n
下一行
术语名称 下一行
英语名称 next line
别名 NEL

回车(carriage return)、换行(line feed)是两个控制字符,且均与文本换行相关,常出现在相关语境中。类似功能的还有下一行(next line, NL)等字符。这几个字符出现在很多字符集中。在 ASCII 中回车为 0x0D 、换行为 0x0A ,在 EBCDIC 中回车为 0x0D 、换行为 0x25 且有相当于回车换行的新行(new line) 0x15 ,在 Unicode 中回车为 U+000D <control-000D>, Carriage Return (CR) 、换行为 U+000A <control-000A>, Line Feed (LF), New Line (NL), End of Line (EOL) 、下一行为 U+0085 <control-0085>, New Line (NEL) 。需要指代这两个字符时,经常使用缩写,回车缩写为 CR ,换行缩写为 LF 、 NL 或 EOL ,其连续出现也直接缩写为 CRLF ,也被展示为 ␍ (U+240D Symbol for Carriage Return)、 ␊ (U+240A Symbol for Line Feed 、 ␤ U+2424 Symbol for Newline)。在 ^ 表示法中回车表示为 ^M 、换行表示为 ^J 。 Basic 语言及相关语言将这两个字符记为 vbCrvbLf ,且连接成的字符串记为 vbCrLf , C 语言及相关语言将这个字符记为 \0

历史

Morse 电码时代使用特殊符号中的 BT 记号表示分隔。在后续规范控制字符时,被首先考虑支持。

这两个字符都来自于电传打字机时代。最初打字机让打印头/字车(carriage)回到行首的动作比较缓慢,在操作上分为两个步骤:使用机械结构松开弹簧等将字车(carriage)推回(return)支架最左端,返回字车,简称回车(carriage return),将纸张向上推送一行,即把纸向机器里喂入(feed)一个行(line)的高度,简称换行(line feed)。电传打字机时代规范控制字符时将其规范为 CR+LF 或 LF (并且在不同的规范间有差异)。由于电传打字机也需要时间将字车推回行首,为避免下一行第一个字位置错误, CR+LF 是最常使用的,而且通常也会发送额外的 CR 或 NUL 并忽略这些字符,来保证有足够时间让字车回到最左侧。收到这两个字符时, CR 代表字车回到最左侧; LF 代表将纸向上移动一行,。

现代使用

现在键盘上的 Enter ⏎ 键仍然保留了打字机右侧“回车”手柄的中文名称,但其英语名称“进入”则是功能上表示确认或选择。

现代不同系统中,文本文件会使用不同的换行符,一般来讲, Windows 中使用 CRLF ,类 Unix 使用 LF 。但是也存在一些特殊的情况,比如 MacOS 9 及更早版本中使用 CR 换行, IBM 一些使用 EBCDIC 的机器使用 NL 换行。 Windows 不会将单独的 CR 或 LF 解释为换行,因此对应的来自其他系统的文件常常展示为一大行,而相反的情况, Windows 的文件在类 Unix 系统中展示时,所有的行尾都会出现 ^M<cr> ,也就是 CR 作为控制字符被展示出来,然后 LF 正常起换行功能。

无论是以上哪一种换行方式,在文本文件中,换行都存在两种自洽的使用标准:作为分隔符分开不同的行,换行只出现在行与行之间;每次出现时代表一行结束,文件尾作为最后一行的结束也要求有一个换行。区别就是前者不强制在文件最后放置一次换行,而且将以换行结尾的文件理解为最后有一个空行;而后者则相反,只有最后遇到换行符时才能将最后一行作为一个完整的行处理。

大部分通信协议中保留了 CRLF 换行,同时推荐应用也将 LF 视为 CRLF 处理以达成容错。

部分场景中,可能同时存在换行不分段和分段的两种换行,可能对应着不同的换行符号或其组合。

在有的终端中, CR 会类似打字机中的功能,将光标返回同一行行首,有的则不会,展示成 ^M 。但 LF 基本上都是完成换行。

参考资料