回车符 \r
和换行符 \n
在IT技术中有什么区别?
具体而言,\r
和\n
之间是否存在任何实际差异?是否有应使用其中一个而不是另一个的情况?
回车符 \r
和换行符 \n
在IT技术中有什么区别?
具体而言,\r
和\n
之间是否存在任何实际差异?是否有应使用其中一个而不是另一个的情况?
就 ASCII 码而言,它是 3——因为它们分别是 10 和 13;-)。
但说真的,有很多:
\n
是行末的代码,\r
没有特殊含义\n
是行末的标准转义序列(根据需要转换为/从特定于操作系统的序列)\r
是行末的代码\r\n
,按照这个顺序\r\n
是Internet上文本格式的标准行终止符\r
命令马车向左移动直到碰到最左边的停止位(一个缓慢的操作),\n
命令滚轮向上滚动一行(一个更快的操作)-- 这就是为什么你总是有\r
在\n
之前,这样滚轮可以在马车仍然向左移动时移动!-) 维基百科有更详细的解释。\r
和\n
的作用类似(除了光标之外,因为那里没有马车或滚轮;-)实际上,在现代文本文件写入的情况下,你应该始终使用\n
(如果你在奇怪的操作系统上,比如Windows,底层运行时将进行翻译)。唯一需要使用\r
的原因是,如果你要写入字符终端(或更可能是模拟它的“控制台窗口”),并且想要下一行你写的内容覆盖刚刚写的上一行(有时用于幼稚的“ASCII动画”效果,例如进度条)-虽然在GUI的世界里这已经过时了;-)。
\n
之后添加额外的无害字符(通常为NUL即\0
),以便多余的时间。操作系统会透明地处理这个过程,因此您在遗留代码中找不到任何痕迹。 - Mark Ransom\r
(我在使用Linux),所以遇到了一些非常糟糕的经历。当我开始解析一份看似有效的文件时,我的解析器失败了,因为我正在解析的文件是在Windows中创建的。:D 在这一切中的主要问题是\n
或\r
都不可见,就像字符a
、.
、(
等一样。 - rbaleksandar在历史上,\n
用于向下移动打印机的打印头,而 \r
则用于将打印头移回到页面的左侧。
printf("abcdefghijlm\rNOP\n");
在OpenSuSe上使用gcc-8编译并在终端上运行的输出结果为NOPdefghijlm
。字符串中的\r(回车符)使光标移动到行首并且\r后面的字符(即“NOP”)覆盖了先前的字符(即“abc”)。你也可以使用退格键(\b)来实现类似的"回车移动"效果,例如printf("abcdefghijlm\b\bNOP\n");
将产生abcdefghijNOP
的结果。 - GMc两个不同的字符。
\n
在Unix文本文件中用作行末终止符。
\r
(在OS X之前)在Mac文本文件中被用作行末终止符。
\r\n
(即同时使用这两个字符)在Windows和DOS文本文件中用于终止行。
\r
已经不再是 Mac 上的换行符号了很长时间了。自从 2001 年发布基于 Unix 的 Mac OS X 系统之后,现在使用的是 \n
。 - jbbuckley\r
,例如:MS Office 2011 Excel:保存一个CSV文件(采用默认设置)- 将保存一个带有\r
行结尾的ISO-8859-1编码文件。 - CodeBrauer\r\n
起源于打字机和类似的设备。在使用多行功能打字机时,当您想要一个新行时,需要执行两个物理动作:将纸张滑回页面的开头(向左,在美国),并将纸张上移一格。在线打印机时代,例如,做粗体文本的唯一方法是执行一个没有换行符的回车,并在旧字符上打印相同的字符,从而增加更多的墨水,使其看起来更深(加粗)。当打字机的机械“换行”功能失败时,这就是让人讨厌的结果:如果您没有注意,您可以在先前的文本行上键入文字。不同操作系统使用两种不同的字符。在传输数据时,这也会影响到使用 TCP/IP
的情况,需要使用 \r\n
。
\n
用于 Unix。
\r
用于 Mac。
\r\n
用于 Windows 和 DOS。
\r
:回车符 CR —将光标返回到一行的开头\n
:换行符(新行)LF —向上移动一行纸张在屏幕输出的情况下:
例如:
Hello,\nworld\r!
应该在您的终端上呈现为:
Hello,
! world
一些操作系统可能会破坏与预期行为的兼容性,但这并不会改变对“\n和\r之间的区别”这个问题的回答。
\r
将光标发送到行首,并使用\n
将光标置于新行。例如,请尝试: To complete,
echo -en "AA--AA" ; echo -en "BB" ; echo -en "\rBB"
AA--AA
AA--AABB
BB--AABB
但不要忘记使用-en
作为参数。
在Windows中,\n
会移动到下一行的开头。而\r
则是将光标移到当前行的开头,而不会移动到下一行。在我的控制台应用程序中,我会使用\r
来测试一些代码并且不想看到文本在屏幕上滚动。例如,当我打印出一些文本(如帧率(FPS))后,我会使用printf("%-10d\r", fps);
,这将把光标返回到行的开头,而不向下移动到下一行,并且可以在屏幕上显示其他信息,以便在同一行上更新帧速率同时不会被覆盖。(其中的%-10
确保输出至少有10个字符,并且左对齐,所以最终会填充空格,覆盖该行的任何旧值)。这对于像这样的东西非常方便,通常是在我将调试信息输出到我的控制台屏幕时。
一个小历史
/r
代表着回车或归位,它的历史渊源可以追溯到打字机时代。回车操作会让打字机的滑轨移动到最右边,以便在一行的开头进行打字。
/n
代表着换行,同样来自于打字机时代,你需要将滑轨移动到下一行。不过并不一定是移到下一行的开头,这就是为什么一些操作系统需要在\r
后面加上一个\n
的原因,因为这是打字机进行操作的顺序。这也解释了为什么旧的8位计算机使用Return而不是Enter,因为它更熟悉carriage return。
\n
和\r
之间是否存在任何实际差异?有没有应该使用其中一个而不是另一个的情况?\n
代表换行和\r
代表回车的转义序列进行一个简单的实验,以说明它们之间的明显差异。换行程序:
#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
在每个打印序列的末尾时,下一个迭代不会进入以下文本行-在每个打印序列的末尾,光标没有跳到*下一行的开头。\r
字符之前的末尾所在的行上。 -结果是每个随后的打印序列都将替换前一个打印序列。 \ n
不一定跳转到以下文本行的开头。在一些通常更老的操作系统上, \ n
换行符的结果可以是它可以跳转到以下任何位置,而不仅仅是开头。这就是为什么它们需要使用 \r \n
以获得下一行文本的开头。