\n和\ r \n之间的区别?

3zz*_*zzy 556 newline carriage-return

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

特别是,和之间有什么实际的区别吗?是否有应该使用的地方而不是另一个?\n\r

Ale*_*lli 769

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

但严重的是,有很多:

  • 在Unix和所有类Unix系统中,\n是行尾的代码,\r没什么特别的
  • 因此,在C和大多数语言中以某种方式复制它(甚至远程),\n是行尾的标准转义序列(根据需要转换为特定于OS的序列)
  • 在旧的Mac系统(OS X之前)中,\r是代码行的代码
  • 在Windows(以及许多旧操作系统)中,行尾的代码\r\n按此顺序为2个字符
  • 作为一个(令人惊讶的;-)结果(回溯到比Windows更早的操作系统),\r\n是因特网上文本格式的标准行终止
  • 对于类似电子机械类型的"终端",\r命令托架向左返回直到它到达最左边的停止(慢速操作),\n命令滚轮向上滚动一行(更快的操作) - 这就是你总是有的原因\r 之前 \n,因此当马车仍然向左移动时,滚轮可以移动! - )维基百科有更详细的解释.
  • 为字符模式端子(典型地模仿如上偶数旧的印刷的),在原始模式下,\r\n作用相似(除了无论是在光标而言,因为没有托架或滚柱;-)

在实践中,在写入文本文件的现代环境中,您应该始终使用\n(如果您使用的是奇怪的操作系统,则底层运行时将翻译它,例如Windows ;-).使用的唯一原因\r是如果你正在写一个字符终端(或更可能是一个模拟它的"控制台窗口"),并希望你写的下一行覆盖你刚写的最后一行(有时用于傻瓜"ascii动画"例如进度条的影响" - 这在GUI的世界中变得相当过时了;-).

  • @mailmindlin - 你问"Windows如何成为'奇怪的'操作系统?".答:在很多方面我都可以轻易计算(穿袜子时,不允许脚趾:-).所有其他幸存的操作系统都是基于Unix的... Windows是一个出局的,在很多方面都是出类拔萃的.在这个特定的Q的上下文中 - 它是唯一一个假设两个字节(\n\r)作为规范的行尾......除了在线程上其他地方解释的古代历史之外没有任何合理的理由......每隔一个操作系统有一个char a5 line-end(其中99%+`\n'). (29认同)
  • 要添加到这个答案中的历史记录:当线速度从每秒10个字符增加时,运输返回需要超过2个字符的时间,并且在此之后添加了额外无害的字符(通常为NUL,即`\ 0`). `\n`允许额外的时间.这是由操作系统透明处理的,因此您不会在遗留代码中找到任何痕迹. (12认同)
  • Windows是一个"怪异"的操作系统? (9认同)
  • “所有其他幸存的操作系统都是基于 Unix 的”并不奇怪,因为它们都只是 Unix 的一些排列。这就像说香草是一种奇怪的冰淇淋口味,因为 100 人决定在他们的巧克力冰淇淋上撒上 100 种不同的配料,从而创造出 100 种不同的口味。我真的厌倦了人们比较 WINdows 和 Unix,就像它们应该是彼此的替代品一样。这就像将跑车与拖拉机进行比较,因为它们都是机动车辆。然后声称一个比另一个更好,时期。 (4认同)
  • 给所有将在生活中的某个时刻编写某种解析器的人的一个小建议-永远不要忘记正确处理行尾。我有一些讨厌的经历,只是因为我忘记了\ r(我正在使用Linux)。一旦我开始解析似乎是有效的文件,解析器就会失败,因为要解析的文件已在Windows中创建。:D所有主要的问题是,在某种意义上,例如\ a`,`.`,`(`等字符都不可见,因此\\ n或\ r都不可见。 (3认同)
  • @nothingisnecessary:例如,https://tools.ietf.org/html/rfc5322,它取代了 RFC 2822,定义了电子邮件的格式。 (2认同)

tst*_*ter 121

历史上,a \n用于向下移动托架,而\r用于将托架移回页面的左侧.

  • 对计算机问题可能不是一个非常实际的答案,但历史花絮无论如何得到了我的支持. (8认同)
  • 所有运动都是相对的.这篇论文是我的世界,相对于它,马车正在向下移动:P (5认同)
  • 呃,我的意思是在*现代*计算机上不实用,当然. (2认同)
  • 想象一下 \r 类似于您将物理打字机的打字部分推到左侧(又名)。返回。 (2认同)
  • \ n不会向下移动笔架,它会转动滚轴使纸张向上移动。 (2认同)
  • FWIW,\ r在现代系统上仍可以是“回车”。考虑一下此C代码`printf(“ abcdefghijlm \ rNOP \ n”);`在OpenSuSe上用gcc-8编译并在终端上运行,结果为此输出`NOPdefghijlm`。字符串中的\ r(回车)会导致光标移动到行(回车)的开头,而\ r后的字符(即“ NOP”)将覆盖之前的内容(即“ abc”)!您可以像使用```printf(“ abcdefghijlm \ b \ bNOP \ n”);`中的退格键(\ b)来实现类似的“运输”一样,产生`abcdefghijNOP` (2认同)

pav*_*ium 31

两个不同的角色.

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

\r 用作Mac文本文件中的行尾终止符

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

  • 澄清一下:`\ r``在很长一段时间内都没有在Mac上结束.随着2001年Mac OS X的发布(基于Unix),现在使用了`\n`. (7认同)
  • 请注意,有些计算机在您按下 ENTER 键时使用 \n\r 作为行尾标记,例如 Acorn 和 RISC OS。 (2认同)
  • 但是仍然有一些使用“ \ r”的应用程序-例如MS Office 2011 Excel:保存CSV(具有所有默认设置)-将保存带有\ r行尾的ISO-8859-1编码文件。 (2认同)

not*_*ary 22

因为没有其他人特别提到它(它们是否太年轻而不知道/记得?) - 我怀疑使用的\r\n是打字机和类似设备.

如果您在使用支持多行功能的打字机时想要换行,则必须执行两项物理操作:将滑架滑回页面的开头(左侧,在美国),然后将纸张向上送一个档位.

回到行式打印机的时代,唯一可以做粗体文本的方法是,在没有换行的情况下进行回车并在旧行上打印相同的字符,从而添加更多墨水,从而使其看起来更暗(粗体) .当机械"换行"功能在打字机中失败时,这就是令人讨厌的结果:如果您没有注意,可以输入上一行文本.

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

Ian*_*oyd 17

    \n
  • \\r:回车 R\xcc\xb2eturn CR \xe2\x80\x94 将回车返回到行首
  • \n
  • \\n换行(N\xcc\xb2ew 行)LF\xe2\x80\x94 将纸张向上移一行
  • \n
\n

在屏幕输出的上下文中:

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

例如:

\n
\n

你好,\\n世界\\r!

\n
\n

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

\n
Hello,\n!     world\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n


a43*_*511 12

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

\n Unix的

\r 苹果电脑

\r\n Windows和DOS.

  • 我认为你对应用协议感到困惑,TCP/IP不知道\n和\ r. (9认同)
  • TCP/IP不需要使用\ r \n.基于Telnet的各种协议都需要它,包括SMTP,POP3,FTP,HTTP,...... (4认同)

Aka*_*run 9

去完成,

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

例如,尝试:

echo -en "AA--AA" ; echo -en "BB" ; echo -en "\rBB"
Run Code Online (Sandbox Code Playgroud)
  • 第一个"回声"显示 AA--AA
  • 第二 : AA--AABB
  • 最后 : BB--AABB

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


Nei*_*Roy 8

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

一点历史

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

/n 再次代表“换行”,从打字机时代开始,您移到了新行。但这并不是它的开始,这就是为什么一些操作系统需要一个 /r 返回,然后是一个 /n 换行符,因为这是打字机的顺序。它还解释了使用的旧 8 位计算机有“回车”而不是“回车”,来自熟悉的“回车”。


Rob*_*rtS 5

\n

\xe2\x80\x99s \\n(换行符)和\\r(回车符)之间有什么区别?

\n

\\n特别是,和之间有任何实际差异吗\\r?有哪些地方应该使用其中一种而不是另一种?

\n
\n
\n

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

\n

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

\n

该程序只是迭代将一个句子打印到控制台,这是通过 for 循环迭代完成的。

\n
\n

换行程序:

\n
#include <iostream>\n\nint main(void)\n{\n    for(int i = 0; i < 7; i++)\n    {\n       std::cout << i + 1  <<".Walkthrough of the for-loop \\n";   // Notice `\\n` at the end.\n    }\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
1.Walkthrough of the for-loop\n2.Walkthrough of the for-loop\n3.Walkthrough of the for-loop\n4.Walkthrough of the for-loop\n5.Walkthrough of the for-loop\n6.Walkthrough of the for-loop\n7.Walkthrough of the for-loop\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,此结果不会在任何系统上提供,您正在执行此 C++ 代码。但它适用于最现代的系统。请阅读下文了解更多详情。

\n
\n

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

\n

回车程序:

\n
#include <iostream>\n\nint main(void)\n{\n    for(int i = 0; i < 7; i++)\n    {\n       std::cout << i + 1  <<".Walkthrough of the for-loop \\r";   // Notice `\\r` at the end.\n    }\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
7.Walkthrough of the for-loop \n
Run Code Online (Sandbox Code Playgroud)\n
\n

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

\n

相反,在使用该字符之前,光标跳回行首,也就是他所在的行尾\\r。- 结果是打印序列的每个后续迭代都会替换前一个迭代。

\n

*注意:A\\n不一定跳转到以下文本行的开头。在某些操作系统(通常是更古老的操作系统)上,\\n换行符的结果可能是跳到下一行中的任何位置,而不仅仅是开头。这就是为什么,他们需要使用\\r \\n来获取下一个文本行的开头。

\n
\n

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

\n

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

\n

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

\n