回车符、换行符
回车 | |
---|---|
术语名称 | 回车 |
英语名称 | 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 语言及相关语言将这两个字符记为 vbCr
和 vbLf
,且连接成的字符串记为 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 基本上都是完成换行。