提醒- \r\n 还是 \n\r?

445

我只是记不住这些,那么,正确终止旧式ASCII行的方法是什么?


13
如果您这样做,请确保以二进制模式打开文件。否则,标准的C/C++文件流将把"\n"(对于文本文件(默认值))转换为平台特定的行尾序列(ELS)。因此,在Windows上,"\r\n"会转换为物理磁盘上的"\r\r\n"。注意:如果您只是使用C/C++从文件中读取文件,则不会注意到ELS,因为从文件中读取时ELS会被转换回"\n"。 - Martin York
@Martin - 我在使用 .net,举个例子,我正在使用 File.AppendAllText,并使用 "\r\n",我刚刚查看了一个文件,发现行末没有 \r 重复。神奇吧? - Daniel Mošmondor
@Martin - 在十六进制模式下使用了PSPad... - Daniel Mošmondor
1
在古老的键盘上,Enter键被称为Return键。因此,Return先出现,然后产生Linefeed响应。当你拥有太多历史时,这一切都变得如此明显。 - Mark Ransom
现在就是! - undefined
显示剩余2条评论
11个回答

1250

我会用单词“return”来记忆,r在n的前面。


130
记住使用的单词是“return”,记住\r 是“回车符”。不要记得“Return”是Mac键盘上按键的名称,否则您可能会在以后看到称为“Enter”的PC键盘按键时,错误地排列字母顺序! - Rob Kennedy
4
但我在想,\n\r\r\n的效果是相同的,它们不是产生了相同的效果吗?你能告诉我它们之间的区别吗? - Mr.Anubis
9
如果您有某种确定的点阵打印机,那么指令的顺序并不重要,不应该有任何区别。然而,在某些打印机上,您可能会得到额外的空行或根本没有换行。同时,以上提到的内容也适用于文本编辑器——它们会感到困惑,TextStream类也会出问题。指令的顺序确实很重要。 :) - Daniel Mošmondor
13
你可以记住顺序很重要,或者当你在SO上提问时,有人给了你一个提醒,但你后来忘记了。或者你不能使用你的姓作为提醒,因为那里的字母r和n的顺序是相反的 :) - Daniel Daranas
5
@RobKennedy 哈哈,你知道我来这里读了有关"return"的内容,然后想着“太好了!”但是接着我又看了你的评论。现在每次我忘记不该看哪个键时,我都会看我的“Enter”键,然后想:“这里出了什么问题...”哈哈,可能想多了! - Wayne Uroda
显示剩余5条评论

56
如果您使用C#,应该使用Environment.NewLine,根据MSDN的说明,它是:

对于非Unix平台,包含"\r\n"的字符串;对于Unix平台,包含"\n"的字符串。


49
实际上这取决于你在做什么。如果你只是将纯文本输出到控制台或文件中供本地使用,那么 Environment.NewLine 就可以了。然而,如果你要按照特定格式编写内容,那么该格式可能会定义换行符。例如,HTTP 协议规定,无论平台如何,你必须使用 \r\n 作为头部等的行终止符。 - Matti Virkkunen
3
是的,这是非常糟糕的建议。 - IvanP
这就是为什么您需要转义您的Web消息并构建单元测试来验证发送\r\n(Windows),\r(Mac),\n(Linux)是否正确发送到Web服务器。 - TamusJRoyce

42

换行符取决于你的操作系统:

DOS & Windows: \r\n 0D0A (hex), 13,10 (decimal)
Unix & Mac OS X: \n, 0A, 10
Macintosh (OS 9): \r, 0D, 13

更多细节请查看:https://ccrma.stanford.edu/~craig/utility/flip/

如果不确定,使用任何免费的十六进制查看器/编辑器查看文件如何编码换行符。

对于我来说,我使用以下指南来帮助我记忆:0D0A = \r\n = CR,LF = 回车换行。


10
有趣的是,我是那些能够熟记 0D0A 的人之一,但仍然会混淆 \r\n - Nyerguds
1
我记得\r是回车符,\n是换行符...只是我不记得它们的顺序,所以这并不能帮助我记住哪个是0D,哪个是0A ;) - Nyerguds

23

序列是 CR(回车)- LF(换行)。还记得点阵打印机吗?就是这样。所以,正确的顺序是 \r \n。


我认为这是最合乎逻辑的答案。 - David Snabel-Caunt
12
LF+CR 在打印机上可以达到和 CR+LF 相同的效果。 - ikegami
11
我不同意,@David。仅仅想到点阵打印机(或打字机,因为它们才有返回的行车)是不够的。只有基本的了解如何工作,并没有理由认为在回到行首之前还是之后推进纸张会有影响。 \r\n 和 \n\r 都将纸张放置在相同的位置上。 - Rob Kennedy
@ikegami 在大多数打印机上可以实现,但并非所有打印机都支持。它们还有DIP开关来配置这种行为。 :) - Daniel Mošmondor
5
将换行符放在回车符后面的原因之一是减少所需的总时间-当打印头返回到纸张的左边缘时,压轮可以索引一行。较长的操作先开始,因此整个操作在较长操作执行的时间内完成。我们当时为了这样的原因做了很多事情;想象一下以110波特等待几百行的情况... - Jerry Andrews
@JerryAndrews,它仍然没有给出为什么首先是CR的许多线索。如果平台在头部返回时滚动,则表示正在进行多任务处理。然后,如果滚动纸张(如果首先开始滚动),则没有线索为什么打印机不会移动头部。即使在110波特率下,每14行大约损失1秒钟。 - LogicDaemon

8
在任何 .NET 语言中,Environment.NewLine 都是更可取的。

不适用于常量字符串。在需要时,最好不要使用常量,而是使用静态字符串 ;) - TamusJRoyce

5

\r\n 在 Windows 系统中可以正常使用。


单个的\n在Windows上也能很好地工作,包括最新版本的记事本。 - André Caron
我认为现代编辑器会检测行尾,因为不同的操作系统使用不同的行尾。 - David Snabel-Caunt
1
实际上,如果您将此内容打印到文件中(在Windows上以文本模式打开的std C/C++文件),则物理文件将包含“\r\r\n”(请使用十六进制编辑器进行检查)。当您读取它时,“\r\n”会被转换回单个“\n”。 - Martin York
2
实际上,@DavidCaunt,我刚刚尝试了\n,但在Win8上的记事本中无法使用。 - philk

5
请注意手动操作时要小心。
事实上,我建议根本不要这样做。
实际上,我们谈论的是特定于平台的行终止序列LTS。
如果您以文本模式(即非二进制)打开文件,则流将将“\n”转换为适合您平台的正确LTS。然后在读取文件时将LTS转换回“\n”。
因此,如果您将“\r\n”打印到Windows文件中,则会在物理文件中得到序列“\r\r\n”(可以使用十六进制编辑器查看)。
当涉及在不同平台之间传输文件时,这确实是一种痛苦。
现在,如果您正在写入网络流,则我会手动执行此操作(因为大多数网络协议都明确指出了这一点)。但是,请确保流没有进行任何解释(因此适用于二进制模式)。

好的。我有一个文本区域供用户输入一些文本,然后这个文本需要转换为HTML,例如用<br>替换每个“新行”(如果有三个连续的“新行”,则应该是三个<br>)。问题是,写入此字段的用户使用不同的设备。因此,在某些情况下,它可能是\n,在其他情况下可能是“\r\n”或仅为“\r”。因此,您需要了解最常见的符号,以便正确执行此任务。 - pilat
@pilat 这是一个真正的问题。当处理文本文件时,您需要了解是哪个“设备”最后写入了该文件(以便进行适当的转换)。这真的很混乱。我建议您根本不要使用文本模式;而是使用二进制模式,这样您的流就不会被流解释。 - Martin York
这是一个用于用户输入的文本区域。我不能要求所有用户只使用Linux或者只使用MacOS,例如。但是我需要确保所有输入的文本都能够正确地呈现出来。 - pilat
@pilat 这个问题是关于在“文本”模式下保存文本到文件时的转换,没有其他的。让事情保持一致取决于您的应用程序。 - Martin York

4

来自维基百科(您可以在该文章中了解适合您的操作系统的正确格式):

基于ASCII或兼容字符集的系统分别使用LF(换行符'\n',十进制为0x0A或10)或CR(回车符'\r',十进制为0x0D或13)或者CR+LF(CR后跟LF,'\r\n',十六进制为0x0D0A)。


4

\r\n

这个记忆很奇怪,因为它与我使用的打字机完全相反。
如果是正常的话,我不需要记住它...:-)

typewriter from wikipedia *图片来自维基百科

在打字机上,当你完成输入一行后,你需要使用回车杆,在滚动鼓之前使用换行符,然后允许你手动操作回车

你可以从freesound.org听到纸张开始进纸的声音,并在结束前约-1:03秒,在警报铃响起后,听到鼓滚动和回车的声音。


2
如果你正在使用C#,为什么不使用Environment.NewLine?(我假设你正在使用一些文件写入对象...只需传递Environment.NewLine,它将处理正确的终止符。)

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