回车符、换行符和分页符是什么?

651
以下控制字符的含义是什么:
  1. 回车

  2. 换行

  3. 分页符


24
“回车”是什么意思?我在我的笔记本电脑上没有看到任何“马车”在“返回”。 :s - Jean Hominal
18
@JeanHominal,“carriage” 基本上是指光标(或古老打字机上的指针),而“return”则意味着回到该行的开头。 - SOFe
13
在我的“终端”“窗口”中,我没有看到任何线头(或玻璃窗格),也没有一个“电传打字机”连接到/dev/tty1。它们都成为了隐喻。 - Piskvor left the building
5
我很惊讶,这只是你想知道的三个控制字符。 - Hakanai
规范候选(2009年):*CR LF、LF和CR换行类型之间的区别是什么?* - Peter Mortensen
规范候选(2009年):*CR LF、LF和CR换行类型之间的区别是什么?* - undefined
13个回答

776

回车指的是在不向下移动的情况下返回当前行的开头。这个名称来自于打印机的走轮,因为当这个名称被创造时,显示器还很少见。这通常被转义为"\r",缩写为CR,并具有ASCII值13或0xD。

换行符意味着向下移动到下一行;然而,它已经被重新定义并更名。作为“换行符”使用,它终止行(常常与分隔行混淆)。这通常被转义为"\n",缩写为LF或NL,并具有ASCII值10或0xA。CRLF(但不是CRNL)用于对应"\r\n"的一对字符。

换页符意味着向下移动到下一页。它曾经常用作页面分隔符,但现在也用作节分隔符。文本编辑器可以在“插入分页符”时使用此字符。这通常被转义为"\f",缩写为FF,并具有ASCII值12或0xC。


作为控制字符,它们可以以各种方式进行解释。

最重要的解释是这些字符如何分隔行。在Unix(包括OS X)上,行以NL结尾,在Windows上以CRLF结尾,在旧版Mac上以CR结尾。请注意,从LF到NL的含义转变,对于完全相同的字符,给出了Windows和Unix之间的差异,这也是为什么许多Windows程序使用CRLF来“分隔”而不是“终止”行的原因。许多文本编辑器可以读取这三种格式中的任何一种并在它们之间进行转换,但并非所有实用程序都可以。

进纸符号很少使用。作为页面分隔符,它只能出现在行之间或文件的开头或结尾。


16
我可以确认,OS X 使用与 Unix 相同的 NL 作为换行符(因为 OS X Unix)。而 CR 则用于 Mac OS 9 及以下系统。 - Rory O'Kane
2
FF字符(连同“CTRL-G”响铃字符)今天可能看起来很奇怪,但在视频显示器远不普及且硬拷贝终端被用作数据显示器的时代,它们更具相关性。 - Rick Sarvas
1
那个反馈控制不是 \x0c 吗? - Tjorriemorrie
5
我不知道Mac电脑使用CR的历史。这可能来自于Apple II使用CR。CR在其他8位系统上也很常见,比如Commodore和Tandy。ASCII并不是这些系统上通用的编码:Commodore使用PETSCII,在0x8d处有LF字符(!)。Atari根本没有LF字符。出于某种原因,CR = 0x0d更或多或少成为标准。 - Ssswift
1
值得注意的是,一些程序实际上会将换行符视为分隔符而不是终止符。尽管我能想到的唯一一个是Ace编辑器,它允许你保存一个没有尾随行结束符的文件。另一方面,Nano编辑器总是会添加一个行结束符,Bash脚本如果没有尾随的换行符就不会读取文件末尾的行。 - wjandrea
另外... - Bálint Sass

179

\r是回车符,作用类似于光标回到了行首。

printf("stackoverflow\rnine")
ninekoverflow

意味着它已将光标移动到“stackoverflow”的开头,并覆盖了起始的四个字符,因为“nine”有四个字符长。

\n 是换行符,它会改变行并将光标移到新行的开头,就像这样-

printf("stackoverflow\nnine")
stackoverflow
nine

\f 是换页符,虽然它的使用已经过时,但它仍可用于提供缩进,例如:

printf("stackoverflow\fnine")
stackoverflow
             nine

如果我写成这样 -

printf("stackoverflow\fnine\fgreat")
stackoverflow
             nine
                 great

5
但是这个例子在高级编程语言中行不通! - Mohammad Sina Karvandi
@ᔕIᑎᗩKᗩᖇᐯᗩᑎᗪI 它的意思是:你至少可以在Linux shell中使用coreutils中的printf实用程序来执行相同的操作。甚至可以使用bash内置的echo -en命令。 - Ruslan
如何将文件中的所有行作为一个单独的行传递? - Paras Singh
20
换页符不用于缩进。如果你将几个换页符发送到打印机,它会吐出纸张。你所描述的“\f”实际上是垂直制表符“\v”,尽管在控制台中两者看起来相同。 - cprn
printf("123\f456\f789"); 在控制台上显示 <b>123456789</b>。 - Mayur

58

简而言之:

  • 回车符\r0xD):控制光标在同一行起始位置
  •           换行符\n0xA):控制光标在下一行起始位置
  •          换页符\f0xC):控制光标在下一页起始位置

更多细节和更多的控制字符可以在以下页面找到:控制字符


16
应该鼓励这样简明扼要的回答。 - user5280911
1
简洁的回答只在少数领域中显得优雅,比如在数学中。Windows使用了 0x0A 0x0D 两种选择,这些选择是任意的。概念不是孤立存在的,因此简洁的答案不适用于这些情况。 - daparic
1
@user5280911 是的,尽管在解释之后提供更多细节也可能很有用,特别是在像这样还有其他细节需要考虑的情况下。 - Reid Moffat
1
简洁的答案适合你只是轻度感兴趣并急于解决问题的情况。 - nCardot
1
简洁的答案也许隐藏着陷阱,尤其是在编程领域。 - navylover

30

请看维基百科

使用基于ASCII或兼容字符集的系统会单独使用LF(换行,'\n',0x0A,十进制中的10)或CR(回车,'\r',0x0D,十进制中的13),或者使用CR后跟LF(CR + LF,0x0D 0x0A)。这些字符基于打印机命令:换行指示打印机应输出一行纸张,回车指示打印机车厢应返回到当前行的开头。


28

\f 用于分页符。
你无法在控制台上看到任何效果。但是当你在文件中使用这个字符常量时,你会看到不同之处。

另一个例子是,如果你可以将输出重定向到一个文件中,那么你就不必编写一个文件或使用文件处理。

例如:

在 c++ 中编写以下代码:

void main()    
{
    clrscr();
    cout<<"helloooooo" ;

    cout<<"\f";
    cout<<"hiiiii" ;

}

编译后会生成一个exe文件(例如abc.exe)。

然后,您可以使用以下命令将输出重定向到文件:

abc > xyz.doc

接下来打开文件xyz.doc,您就可以看到hellooo和hiiii....之间的实际分页符


24

在老式的打印终端上,换行需要执行两个动作:将打印头移回水平扫描范围的起始位置(回车符),并将正在打印的纸卷向前推进(换行符)。

由于我们不再使用纸质打印终端,这些操作已经不太相关了,但是用于表示它们的字符在各种版本中仍然存在。


实际上,“回车”并不会将打印头移动到左侧,而是将夹持印版的滑架向右移动。以前有一个长杠杆,由左手操作来完成这个任务。详见http://en.wikipedia.org/wiki/Typewriter。 - Mark Lakata
3
@MarkLakata的评论针对打字机,但该答案是关于旧版打印终端的。例如DEC LA36(http://www.columbia.edu/cu/computinghistory/la36.html)。 - Peter Cardona
1
旧式机械打字机和一些电动打字机上的回车键确实会将纸张架和印版向右移动。由于文档被固定在纸张架上,将纸张架向右移动会使打印位置向左移动。在带有移动打印头的电动打字机和大多数电传打字机上,纸张架和印版不会水平移动,而是打印头移动。在这种情况下,回车键将打印头返回到左侧。在两种情况下,回车键都将打印位置返回到行的开头。 - user693336

23
除了上述信息外,还有一个关于LF(\n)和CR(\r)的有趣历史。
在计算机出现之前,有一种称为Teletype Model 33的电传打字机。它每秒可以打印10个字符。但是这里有一个问题,每行打印完成后,它需要0.2秒移动到下一行,相当于打印2个字符的时间。如果在这0.2秒内传输了新字符,则这个新字符将丢失。
因此科学家找到了解决这个问题的方法,他们在每行结束后添加两个结束字符,一个是“回车符”,用于告诉打印机将打印头移到左侧;另一个是“换行符”,它告诉打印机将纸张向上移动1行。
稍后,计算机变得很普遍,这两个概念也被用于计算机。当时,存储设备非常昂贵,因此一些科学家说,在每行末尾添加两个字符太贵了,一个就足够了,因此对使用哪个进行了一些争论。
在UNIX / Mac和Linux中,在每行末尾放置'\n',在Windows中,在每行末尾放置'\r\n'。使用的结果是,如果在Windows中打开UNIX / Mac中的文件,则文件将显示为一行。而在UNIX或Mac中打开的Windows文件将在每行末尾有一个^M。

1
随着OSX(基于BSD Unix)的发布,Mac切换到'\n' - Unix行结尾。 - Jonathan Cross
如果在Windows中打开UNIX/Mac中的文件,则这些文件将显示在一行中。WRITE.EXE(又名Wordpad)可以正常显示它们。 - thecarpy
CR和LF在Teletype Model 33出现之前大约分开了50年:请参见https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.96.678&rep=rep1&type=pdf。 - Artyom Skrobov

18
考虑一台IBM 1403冲击式打印机。CR将打印头移动到行的开头,但未推进纸张。这样就可以进行“覆盖打印”,在一行上放置多行输出。这种方式可以实现下划线和粗体打印。LF将纸张向前推进一行。如果没有CR,下一行将打印为错位步进,因为LF不会移动打印头。FF将纸张推进到下一页。通常也会将打印头移动到新页面上第一行的开头,但这可能需要使用CR。为确保,大多数程序员在页面最后一行编码CRFF而不是CRLF,因为由FF创建的额外CR并不重要。

这是唯一一个完整解释回车符含义的答案。 - Lee
@Lee同意。这些控制字符存在的历史原因和它们所做的事情一样重要。 - r a

12

作为补充,

1、回车符(Carriage return):它是打印机术语,表示将打印位置改变到当前行的开头。在计算机世界中,它通常意味着返回到当前行的开头,在某些情况下也表示换行。

2、换行符(Line feed):它是打印机术语,表示将纸张向前推进一行。因此,回车符和换行符经常一起使用,以便在新行的开头开始打印。在计算机世界中,它通常与换行符具有相同的含义。

3、分页符(Form feed):它是打印机术语,在这个帖子中给出了一个很好的解释。

如果你为20世纪80年代的打印机编程,它将弹出纸张并开始新一页。你几乎肯定永远不需要它。

http://en.wikipedia.org/wiki/Form_feed

它几乎已经过时了,你可以参考转义序列\f是什么?进行详细解释。

请注意,我们可以在某些平台上使用CR或LF或CRLF代表换行,但在其他平台上不能用它们来代表换行。有关详细信息,请参阅维基百科的换行符页面

LF:Multics、Unix和类Unix系统(Linux、OS X、FreeBSD、AIX、Xenix等)、BeOS、Amiga、RISC OS等

CR:Commodore 8位机、Acorn BBC、ZX Spectrum、TRS-80、Apple II系列、Oberon、经典Mac OS版本9及以前、MIT Lisp Machine和OS-9

RS:QNX的先POSIX实现

0x9B:使用ATASCII变体的ASCII的Atari 8位机器(十进制155)

CR+LF:Microsoft Windows,DOS(MS-DOS,PC DOS等),DEC TOPS-10,RT-11,CP/M,MP/M,Atari TOS,OS/2,Symbian OS,Palm OS,Amstrad CPC和大多数早期非Unix和非IBM的操作系统

LF+CR:Acorn BBC和RISC OS排队文本输出。


4
"

"\n"是换行符。它表示结束当前行并在阅读时进入新行。

"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接