提醒 - \r\n 或 \n\r?
Posted
技术标签:
【中文标题】提醒 - \\r\\n 或 \\n\\r?【英文标题】:Reminder - \r\n or \n\r?提醒 - \r\n 或 \n\r? 【发布时间】:2011-09-26 06:09:53 【问题描述】:我只是不记得那些了。那么,正确终止老式 ASCII 行的正确方法是什么?
【问题讨论】:
如果您这样做,请确保您以二进制模式打开文件。否则,标准 C/C++ 文件流会将“\n”(对于文本文件(默认))转换为特定于平台的行尾序列 (ELS)。因此,Windows 上的“\r\n”将转换为物理磁盘上的“\r\r\n”。注意:如果你只是使用 C/C++ 来读回文件,你不会注意到从文件中读取时 ELS 被转换回“\n”。 @Martin - 我在.net中,并且正在使用(对于这个例子)File.AppendAllText,带有“\r\n”,我只是查看了一个文件,并且有行尾没有 \r 重复。魔法? @Daniel:我应该更具体一些。 C/C++ 流。当与文件关联并以文本模式打开时。它还取决于您如何查看文件(使用十六进制编辑器)。 @Martin - 以十六进制模式使用 PSPad... 在古代键盘上,Enter 键被称为 Return 键。所以先返回,然后生成换行作为响应。当你有太多的历史时,这一切都很明显。 【参考方案1】:我会使用“return”这个词来记住,r 在 n 之前。
【讨论】:
要记住要使用的词是 return,记住 \r 是 回车。不要记住“Return”是 Mac 键盘上的键名,否则您以后可能会看到 PC 键盘,看到名为“Enter”的键并弄错字母顺序! @David 但我想知道\n\r
和\r\n
的效果是一样的,不是它们的效果一样吗?你能分辨出来吗?
@Mr.Anubis 如果你有 certain 点阵打印机,应该没有区别,因为命令的顺序不应该很重要。但是,在某些打印机上,您会得到额外的空行,或者根本没有行前移。上面所说的一切都适用于文本编辑器——他们会感到困惑,TextStream 类会生病,等等。命令是很重要。 :)
@DanielMošmondor 或者,您可以记住顺序很重要。或者当你在 SO 询问时,有人给了你一个提醒,你后来忘记了。或者您不能使用您的姓氏作为提醒,因为 r 和 n 的顺序颠倒了:)
@RobKennedy 哈哈,你知道我来这里是读到关于返回的信息,并认为“太棒了!”。然后我读了你的评论。现在,每次我不记得我不应该看哪个键时——我看着我的“Enter”键,我认为“这里出了点问题”……哈哈,想多了!【参考方案2】:
如果您使用 C#,则应使用 Environment.NewLine
,根据 MSDN,它是:
对于非 Unix 平台,一个包含“\r\n”的字符串,对于 Unix 平台,一个包含“\n”的字符串。
【讨论】:
其实这种取决于你在做什么。如果您只是将纯文本输出到控制台或文件中以供本地使用,Environment.NewLine
很好。但是,如果您以明确定义的格式编写内容,则该格式也可以定义换行符。例如,HTTP 协议规定您必须使用\r\n
作为标头等的行终止符,无论平台如何。
是的,这真是个糟糕的建议。
这就是为什么您需要转义您的网络消息并构建单元测试来验证发送 \r\n (windows)、\r (mac)、\n (linux) 是否正确发送为 \r\ n 到网络服务器。【参考方案3】:
新行取决于您的操作系统:
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 = carriage return, li n饲料
【讨论】:
奇怪的是,我是那些熟记0D0A
的人之一,但仍然混淆\r
和\n
。
或者,我记得 \r 是回车符,\n 是换行符......只是我不记得它们的顺序,所以它无助于记住哪个是 0D 哪个是一个是 0A ;)【参考方案4】:
顺序是 CR(回车)- LF(换行)。还记得点阵打印机吗?确切地。所以 - 正确的顺序是 \r \n
【讨论】:
我认为这是最合乎逻辑的答案 LF+CR 将在打印机上执行相同的 CR+LF。 我不同意,@David。仅仅考虑点阵打印机(或打字机,就此而言,因为它们是有回车的打印机)是不够的。只有关于它们如何工作的基本信息,没有理由认为我们是否在回到行首之前或之后推进论文很重要。 \r\n 和 \n\r 都将纸张放在相同的位置。 @ikegami 在大多数 打印机上,而不是在所有打印机上。他们也有 DIP 开关来配置这种行为。 :) 在回车后放置换行的一个原因是减少了所需的总时间——当打印头返回到纸张的左边缘时,压板可以索引一行。较长的操作首先开始,因此整个操作在较长的操作执行所需的时间内完成。那时候我们做了很多事情就是因为这样的原因;想象一下以 110 波特等待几百行......【参考方案5】:在任何 .NET 语言中,Environment.NewLine
会更好。
【讨论】:
不适用于常量字符串。需要时,最好不要使用常量,而是使用静态字符串;)【参考方案6】:小心手动操作。 事实上,我建议不要这样做。
实际上,我们讨论的是特定于平台的线路终止序列 LTS。
如果您以文本模式(即非二进制)打开文件,则流会将“\n”转换为适合您平台的正确 LTS。然后在读取文件时将 LTS 转换回“\n”。
因此,如果您将“\r\n”打印到 Windows 文件,您将在物理文件中获得序列“\r\r\n”(使用十六进制编辑器查看)。
当然,在平台之间传输文件时,这确实很痛苦。
现在,如果您正在写入网络流,那么我将手动执行此操作(因为大多数网络协议都特别指出了这一点)。但我会确保流没有做任何解释(所以二进制模式是合适的)。
【讨论】:
【参考方案7】:\r\n
适用于 Windows 就可以了。
【讨论】:
单个\n
在 Windows 上也可以正常工作,包括最新版本的记事本。
我认为现代编辑器会检测行结尾,因为不同的操作系统使用不同的结尾。
实际上不是:如果您将其打印到 Windows 上的文件(以文本模式打开的标准 C/C++ 文件),则物理文件将包含“\r\r\n”(使用十六进制检查编辑)。当您读回它时,“\r\n”将转换回单个“\n”。
其实,@DavidCaunt,我刚试过\n,但它不适用于Win8上的记事本。【参考方案8】:
来自Wikipedia(您可以在那篇文章中阅读适合您的操作系统的内容):
基于 ASCII 或兼容的系统 字符集使用任一 LF(行 feed, '\n', 0x0A, 十进制的 10) 或 CR (回车, '\r', 0x0D, 13 in 十进制)单独,或 CR 后跟 通过 LF (CR+LF, '\r\n', 0x0D0A)。
【讨论】:
【参考方案9】: \r\n
奇怪的是我记得它,因为 它与我使用的打字机相反。
好吧,如果它是正常的,我就不需要记住它了……:-)
*图片来自***
在打字机中,当您完成数字行时,您使用 回车杆,在滚动鼓之前,换行,之后允许您手动操作回车。
您可以在开始时收听from this record from freesound.org 的送纸声音,在结束后的大约-1:03 秒,在响铃警告之后滚动的鼓的行尾声音和之后回车之一。
【讨论】:
【参考方案10】:如果您使用 C#,为什么不使用 Environment.NewLine
? (我假设您使用了一些文件写入器对象......只需将其传递给 Environment.NewLine
,它就会处理正确的终止符。
【讨论】:
以上是关于提醒 - \r\n 或 \n\r?的主要内容,如果未能解决你的问题,请参考以下文章