\n和\r的区别?

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

特别是,\n\r之间是否有实际差异?是否有应该使用一个而不是另一个的地方?

603000 次浏览

两个不同的角色。

\n在Unix文本文件中用作行尾终止符

\r在历史上(在OS X之前)用作Mac文本文件中的行尾终止符

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

从历史上看,\n用于向下移动马车,而\r用于将马车移回页面左侧。

不同操作系统的两个不同字符。这也在通过#EYZ0传输的数据中发挥作用,这需要使用\r\n

\n Unix

\r Mac

\r\n Windows和DOS。

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

但实际上,有很多:

  • 在Unix和所有类Unix系统中,\n是行结束的代码,\r没有什么特别的意思
  • 因此,在C和大多数以某种方式复制它(甚至远程)的语言中,\n是行尾的标准转义序列(根据需要转换为/从操作系统特定的序列)
  • 在旧的Mac系统(前OS X)中,\r是行结束的代码
  • 在Windows(和许多旧的操作系统)中,行尾代码是2个字符,\r\n,按此顺序
  • 作为一个(令人惊讶的;-)结果(回到比Windows更古老的操作系统),\r\n是Internet上文本格式的标准行终止
  • 对于类似电传打字机的“终端”,\r命令马车向左返回,直到它到达最左边的停止(一个缓慢的操作),\n命令滚轮卷起一行(一个更快的操作)-这就是为什么你总是有\r之前\n,这样滚轮就可以在马车仍然向左移动的时候移动!-)维基百科有一个更详细的解释
  • 对于字符模式终端(通常模拟上面的旧打印终端),在原始模式下,\r\n的行为类似(除了光标,因为没有托架或滚轮;-)

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

#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的位置,这是行不通的,试着猜猜为什么?

为了完成,

在shell(bash)脚本中,您可以使用\r将光标发送到前线,当然还有\n将光标放在新行上。

例如,尝试:

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

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

在Windows中,\n移动到下一行的开头。\r移动到当前行的开头,而不移动到下一行。我在自己的控制台应用程序中使用了\r,我正在测试一些代码,我不想看到文本在屏幕上滚动,所以在打印出一些文本后,而不是使用\n,比如说,帧率(FPS),我将printf("%-10d\r", fps);这将使光标返回到行的开头,而不会向下移动到下一行,并允许我在屏幕上有其他信息,当帧率在同一行上不断更新时不会滚动(%-10确保输出至少为10个字符,左对齐,因此最终由空格填充,覆盖该行的任何旧值)。对于这样的东西来说非常方便,通常当我将调试内容输出到控制台屏幕时。

一点历史

/r代表返回回车,它的历史归功于打字机。回车将您的马车一直向右移动,因此您在行的开头打字。

/n代表新线,同样,从打字机时代开始,你向下移动到一个新行。然而,并非没有必要,这就是为什么一些操作系统采用了/r返回后跟/n换行符的必要性,因为这是打字机的顺序。这也解释了过去使用退货而不是输入的旧8位计算机,从回车开始,这是熟悉的。

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

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

例如,在行打印机的时代,做粗体文本的唯一方法是在没有换行符的情况下做回车,并在旧字符上打印相同的字符,从而添加更多的墨水,从而使它看起来更暗(粗体)。当打字机的机械“换行符”功能失败时,这是一个恼人的结果:如果你不注意,你可以在前一行文本上打字。

为了增加混乱,我一直在开发一个简单的文本编辑器,在浏览器的超文本标记语言页面中使用TextArea元素。由于预计CR/LF的兼容性问题,我编写了代码来检查平台,并使用适用于平台的换行符约定。

但是,在检查TextArea中包含的实际字符时,我发现了一些有趣的东西,通过一个小JavaScript函数生成与字符对应的十六进制数据。

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

你好,世界[进入]

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

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

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平台上获得的。但是,问题是:我在谷歌ChromeWindows 7 64位上获得的这个序列。

因此,如果您正在使用TextArea元素并检查文本,请像我上面所做的那样检查输出,以确保从您的TextArea返回的实际字符字节。我还没有看到这在其他平台或其他浏览器上是否有所不同,但如果您通过JavaScript执行文本处理,并且需要使该文本处理平台独立,则值得记住。

上述文章中介绍的约定适用于控制台输出,但超文本标记语言元素似乎遵守UNIX/Linux约定。除非有人在不同的平台/浏览器上发现其他情况。

\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

注意到区别在哪里了吗?区别很简单,当你在每个打印序列的末尾使用Carriage返回转义序列\r时,这个序列的下一次迭代不会进入下面的文本行-在每个打印序列的末尾,光标没有跳到下一行的*开头。

相反,在使用\r字符之前,光标跳回到该行的开头,他一直在该行的末尾。-结果是打印序列的每个后续迭代都替换了前一个。

*注意:\n不一定跳转到以下文本行的开头。在一些,一般更古老的操作系统上,\n换行符的结果可以是,它跳转到以下行的任何地方,而不仅仅是开始。这就是为什么,他们要求使用\r \n来获取下一个文本行的开头。


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

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

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

  • \r马车R eturnCR-将马车返回到行首
  • \n换行(N ew Line)LF-将纸张送入一行

在屏幕输出的上下文中:

  • CR:将光标返回到当前行的开头
  • LF:将光标向下移动一行

例如:

你好\n世界\r!

应该在您的终端上呈现为:

Hello,
!     world

某些操作系统可能会破坏与预期行为的兼容性,但这并不会改变问题“\n和\r之间的差异?”的答案。