\ n和\ r之间的区别?


608

\n(换行符)和\r(回车符)有什么区别?

特别是和之间是否有实际区别?在某些地方应该使用一个而不是另一个?\n\r


3
所有答案都是可以预期的,但是我很想知道\ n和\ r之间是否存在任何实际差异。在某个地方应该使用另一个地方吗?
弗拉德·黑斑羚

9
好吧,是的,只有LF(换行符)的文本文件不会在某些Windows应用程序中被视为终止,而在某些Linus应用程序中打开的情况下,以CRLF终止的文本文件似乎会有多余的字符。
pavium

2
是的,某些Linux控制台应用程序使用\ r来进行旋转线动画。
穆拉利

8
\ r真的仍然是普通的Mac EOL吗?我确定它适用于“经典” Mac,但是我认为OS X已经实现了Unix化。(显示我对Mac的熟悉程度,是吗?)
John Y

11
过去,\ n用于将笔架向下移动,而\ r用于将笔架移回到页面的左侧。
karthik gorijavolu,2012年

Answers:


826

就ASCII码而言,它是3-因为它们分别是10和13 ;-)。

但认真的说,有很多:

  • 在Unix和所有类似Unix的系统中,\n是行尾代码,\r没什么特别的
  • 因此,在C语言和大多数以某种方式(甚至是远程)复制的语言中,它\n是行尾的标准转义序列(根据需要转换为OS特定的序列/从OS特定的序列转换为该序列)
  • 在旧的Mac系统(OS X之前的版本)中,\r用行尾代码代替
  • 在Windows(和许多旧的操作系统)中,行尾代码是2个字符,\r\n按此顺序
  • (令人惊讶;-)的后果(回到比Windows更早的操作系统),\r\n是Internet上文本格式的标准行终止符
  • 对于类似机电电传打字机的“终端”,\r命令滑架向左返回,直到碰到最左边的挡块(缓慢的操作),\n命令滚轮滚动一行(更快的操作),这就是您始终拥有的原因\r 之前 \n,以便滚轮可以在车架仍向左行驶时移动!-)维基百科有更详细的说明
  • 为字符模式端子(典型的模拟偶数旧的印刷那些如上述),在原始模式下,\r\n在光标方面相似的作用(除两者,因为没有托架或滚柱;-)

实际上,在现代的写入文本文件的上下文中,应始终使用\n(如果您使用的是奇怪的操作系统(例如Windows;-,则底层的运行时将翻译该内容)。使用的唯一原因\r是,如果您正在写到字符终端(或者更可能是模仿它的“控制台窗口”),并且希望您写的下一行覆盖您刚写的最后一行(有时用于愚蠢的“ ascii动画” ”,例如进度条的效果),尽管如此,但在GUI的世界中这已经过时了;-)。


12
在此答案中添加历史记录:随着行速从每秒10个字符增加,回车花费了超过2个字符的时间,并且\0在后面添加了额外的无害字符(通常为NUL ie ),\n以允许额外的时间。这是由操作系统透明处理的,因此您不会在旧版代码中找到任何痕迹。
马克·兰瑟姆

11
Windows如何成为“怪异”的操作系统?
mailmindlin

31
@mailmindlin-您问“ Windows是一个'奇怪的'操作系统吗?”。答:除了我可以轻易计数的方式以外(穿袜子时也不允许脚趾:-)。所有其他尚存的操作系统都是基于Unix的... Windows是唯一的一种,在许多方面都是可行的。在这个特定的Q上下文中-它是唯一一个放置两个字节(\ n \ r)作为规范的行尾...没有任何合理的原因,除了在线程上其他地方解释过的古代历史代码之外...每隔一个OS有一个char a5行尾(其中99%+是“ \ n”)。
Alex Martelli 2014年

1
@不需要:例如,tools.ietf.org/html/rfc5322取代了RFC 2822,定义了电子邮件的格式。
基思·汤普森

3
给所有将在生活中的某个时刻编写某种解析器的人的一个小建议-永远不要忘记正确处理行尾。我有一些讨厌的经历,只是因为我忘记了\r(我使用的是Linux)。一旦我开始解析似乎是有效的文件,解析器就会失败,因为要解析的文件已在Windows中创建。:d在所有主要的问题是,无论是\n\r在如下意义上可见,对于例如a.(等字符。
rbaleksandar '16

122

从历史上看\n,使用a来将笔架向下移动,而\r使用a来将笔架移回到页面的左侧。


8
也许这不是对计算机问题的切实可行的答案,但无论如何,历史风云还是引起了我的反对。
约翰Y

1
想象\ r类似于将物理打字机的打字部分推到左侧时的情况。返回。
Jo Smo

2
\ n不会向下移动笔架,它会转动滚轴使纸张向上移动。
罗迪

5
所有运动都是相对的。纸是我的世界,相对于它,马车正在向下移动:P
tster

2
FWIW,\ r在现代系统上仍可以是“回车”。考虑一下printf("abcdefghijlm\rNOP\n");在OpenSuSe上与gcc-8一起编译的C代码,并在终端上运行此结果NOPdefghijlm。字符串中的\ r(回车)会导致光标移动到行(回车)的开头,而\ r后的字符(即“ NOP”)将覆盖之前的内容(即“ abc”)!您可以使用退格(\ b)来实现类似的“马车运动”,printf("abcdefghijlm\b\bNOP\n");即产生的结果abcdefghijNOP
GMc

36

两个不同的字符。

\n 用作Unix文本文件中的行结束符

\r 用作Mac文本文件中的行结束符

\r\n (即两者)用于终止Windows和DOS文本文件中的行。


2
请注意,当您按ENTER键时,有/曾经有计算机使用\ n \ r作为行尾标记,例如Acorn和RISC OS。
Anders 2014年

9
需要说明的是:\r很长一段时间以来,Mac都不是行尾。随着2001年发布的Mac OS X(基于Unix)的使用,\n现在可以使用它。
jbbuckley

3
但是仍然有一些应用程序在使用\r-例如MS Office 2011 Excel:保存CSV(具有所有默认设置)-将保存带有\r-line结尾的ISO-8859-1编码文件。
CodeBrauer

24

由于没有人特别提及它(他们还太年轻,不知道/不记得吗?)-我怀疑\r\n打字机和类似设备使用了Origin。

当您在使用具有多行功能的打字机时想要换行时,它必须执行两个物理操作:将笔架滑回到页面的开头(在美国,左侧),并将纸张送入一个缺口。

回到行式打印机时代,例如,执行粗体文本的唯一方法是在不换行的情况下进行回车,并在旧字符上打印相同的字符,从而增加墨水量,从而使其看起来更暗(合并) 。当机械的“换行符”功能在打字机中失败时,这是令人讨厌的结果:如果您不注意,则可以在前一行文本上键入内容。


3
换行符的ASCII标准为\ r \ n。(除了贝尔电话获得标准委员会控制的短暂间隔)。作为对电话垄断的回报,贝尔电话放弃了消息收发业务(电报,电传打字机),并且不关心该标准的现有用法。HTTP,HTML,PCDOS和MSDOS使用ASCII标准。贝尔电话公司选择非标准的unix,因为他们没有与之兼容的现有业务。
大卫,2016年

12

不同操作系统的两个不同字符。这在TCP/IP需要使用的数据传输中也起着作用\r\n

\n Unix系统

\r 苹果电脑

\r\n Windows和DOS。


10
我认为您对应用协议感到困惑,TCP / IP不了解\ n和\ r。
Jean-loup 2014年

4
TCP / IP不需要使用\ r \ n。各种基于Telnet的协议都需要它,包括SMTP,POP3,FTP,HTTP等...
Lorne侯爵(Marquis of Lorne)

9

去完成,

在shell(bash)脚本中,您可以用于\r在行的前面发送光标,当然也\n可以将光标放在新行上。

例如,尝试:

echo -en "AA--AA" ; echo -en "BB" ; echo -en "\rBB"
  • 第一个“回声”显示 AA--AA
  • 第二 : AA--AABB
  • 最后 : BB--AABB

但是不要忘记使用它-en作为参数。


5

在Windows中,\ n移至下一行的开头。\ r移至当前行的开头,而不移至下一行。我已经在自己的控制台应用程序中使用了\ r,在其中我正在测试一些代码,并且我不想看到文本在屏幕上滚动,因此在打印出一些文本(例如帧频后, FPS),我将打印f(“%-10d \ r”,fps); 这将使光标返回到行的开头,而不会向下移动到下一行,并允许我在画面上不断滚动更新帧速率的同时显示其他信息(%-10表示确定输出至少为10个字符,并保持左对齐,以便最终以空格填充,并覆盖该行的所有旧值)。这样的事情非常方便

一点历史

/ r代表“归还”或“回车”,这归功于打字机的历史。回车将您的车一直向右移动,因此您在行首输入。

/ n代表“换行”,从打字机时代开始,您一直移到新行。不过,这并不是很重要,这就是为什么某些操作系统同时要求同时返回/ r和/ n换行符的原因,因为这是打字机执行输入命令的顺序。这也解释了使用旧式8位计算机的原因。从熟悉的“回车”中选择“返回”而不是“输入”。


1

只是增加了混乱,我一直在使用浏览器的HTML页面中的TextArea元素来开发一个简单的文本编辑器。考虑到CR / LF的兼容性问题,我编写了代码来检查平台,并使用适用于该平台的换行符。

但是,我在检查实际通过一个小的JavaScript函数 TextArea中包含字符,该函数生成了与字符相对应的十六进制数据。

为了进行测试,我输入了以下文本:

您好,世界[输入]

再见,残酷的世界[输入]

当我检查文本数据时,获得的字节序列是这样的:

48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 0a 47 6f 6f 64 62 79 65 2c 20 43 72 75 65 6c 20 57 6f 72 6c 64 0a

现在,大多数人看着这个,看到0a但没有0d字节,就会认为此输出是在Unix / Linux平台上获得的。但是,问题出在这里:我在Windows 7 64位版的Google Chrome中获得了此序列。

因此,如果您正在使用TextArea元素并检查文本,请按照上面的操作检查输出,以确保从TextArea返回了哪些实际字符字节。我尚未看到这在其他平台或其他浏览器上是否有所不同,但是如果您要通过JavaScript执行文本处理,并且需要使该文本处理平台独立,则需要牢记这一点。

以上文章中涉及的约定适用于控制台输出,但是看起来HTML元素遵循UNIX / Linux约定。除非有人在其他平台/浏览器上发现其他问题。


0
#include <stdio.h>

void main()
{
  int countch=0;
  int countwd=1;

  printf("Enter your sentence in lowercase: ");
  char ch='a';
  while(ch!='\r')
  {
    ch=getche();
    if(ch==' ')
      countwd++;
    else
      countch++;
  }

  printf("\n Words = ",countwd);

  printf("Characters = ",countch-1);

  getch();

}

让我们以这个示例为例,尝试将\ n替换为\ r它将不起作用,并尝试猜测原因?


1
仅当您的下划线操作系统在按ENTER键时发送\ r \ n时才有效,例如MS DOS,DECS TOPS-10,CP / M,RT-11等。在OS中:例如Multic,Unix和Unix-like( Linux,Minix等)BeOS,RISCOS等ENTER键只会向您发送\ n字符。
Anders 2014年

1
嗯是过去的美好时光,以前键盘同时具有ReturnEnter。即使是我的现代无线键盘,仍然在旧Return键上显示了向下和向后的箭头(现在标题为“ Enter”,与数字小键盘的Enter键一致,该键不显示箭头)
没必要,2016年

0

\ n(换行符)和\ r(回车符)有什么区别?

特别是\n和之间是否有实际区别\r?在某些地方应该使用一个而不是另一个?


我想\n对换行符和\r回车符各自的转义序列进行简短的实验,以说明它们之间的明显区别。

我知道,这个问题是与语言无关的。尽管如此,我们至少需要一种语言才能完成实验。就我而言,我选择了C ++,但是该实验通常应适用于任何编程语言。

该程序只是简单地迭代一次,即可通过for循环迭代将一个句子打印到控制台中。


换行程序:

#include <iostream>

int main(void)
{
    for(int i = 0; i < 7; i++)
    {
       std::cout << i + 1  <<".Walkthrough of the for-loop \n";   // Notice `\n` at the end.
    }
    return 0;
}

输出:

1.Walkthrough of the for-loop
2.Walkthrough of the for-loop
3.Walkthrough of the for-loop
4.Walkthrough of the for-loop
5.Walkthrough of the for-loop
6.Walkthrough of the for-loop
7.Walkthrough of the for-loop

请注意,您正在执行此C ++代码,因此不会在任何系统上提供此结果。但它应适用于最现代的系统。请阅读下面的详细信息。


现在,相同的程序,但是有所不同,在打印序列末尾\n被替换\r

回车计划:

#include <iostream>

int main(void)
{
    for(int i = 0; i < 7; i++)
    {
       std::cout << i + 1  <<".Walkthrough of the for-loop \r";   // Notice `\r` at the end.
    }
    return 0;
}

输出:

7.Walkthrough of the for-loop 

注意到区别在哪里?区别仅在于,在\r每个打印序列的末尾使用回车转义序列时,该序列的下一个迭代不会进入以下文本行-在每个打印序列的末尾,光标没有跳到下一行的* begin。

相反,光标在使用 \r字符。-结果是打印序列的每个后续迭代都将替换先前的序列。

*注意:A \n不一定要跳到以下文本行的开头。在某些(通常是更老的)操作系统上,\n换行符的结果可能是,它跳到了下一行的任何地方,而不仅仅是跳到开头。因此,他们要求使用\r \n来获取下一个文本行的开头。


该实验向我们展示了在打印序列迭代输出的上下文中换行符和回车符之间的区别。

在讨论输入时程序中时,某些终端/控制台可能会将回车符隐式转换为换行符,以实现更好的可移植性,兼容性和完整性。

但是,如果您可以选择另一个,或者只需要明确使用特定的一个,则应该始终使用适合其目的并严格区分的一个。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.