\r\n有何不同?我认为这与Unix vs. Windows vs. Mac有关,但我不确定它们之间到底有何不同,以及在正则表达式中搜索/匹配的内容。

评论

这需要一个语言标签。不同的语言对'\ n'的解释不同。

#1 楼

他们是不同的角色。 \r为回车,\n为换行。因此,这两个都是在下一行开始打印所必需的。

更重要的是,Unix倾向于使用\r作为行分隔符; Windows倾向于将\n用作行分隔符,而Mac(高达OS 9)则倾向于使用\r作为行分隔符。 (Mac OS X是Unix-y,因此改用\n;虽然在某些兼容情况下还是改用\r\n。)
EDIT:这是语言敏感的。例如,在C#和Java中,\r始终表示Unicode U + 000A,它定义为换行符。在C和C ++中,水有些混浊,因为含义是特定于平台的。有关详细信息,请参见评论。

评论


老人+1。终端输出用于直接控制精美的电子终端(在那些精美的CRT显示器之前的TTY)。因此,我们得到了关于回车符和换行符(如Jon Skeet所述,可能需要两者)和\ a“ bell”,\ b“ backspace”(不要与“ delete混淆”)中的那些东西的奇妙制品。 ”),以及与tty通信所需的所有其他控制字符。

–尔江
09年8月14日在19:48

老人+1。您仍然可以在Windows命令提示符下按Ctrl + G,按Enter,PC扬声器将发出蜂鸣声。那是远古时代遗留下来的。

–戴夫·卡莱尔
09年8月14日在19:58

\ n不一定是ASCII换行符。这是C和C ++的约定,用于在文本模式下执行I / O时引用主机平台的行分隔符。大多数实现碰巧都将ASCII换行符用于\ n,但是我不认为C或C ++标准实际上需要这样做。如果要换行,请使用\ n。如果要换行,请使用\ x0A。相反,无论实现如何,\ r应该是ASCII回车。

–阿德里安·麦卡锡(Adrian McCarthy)
2012年3月1日23:58



@AdrianMcCarthy:当然,这里的问题实际上并未指定C或C ++。例如,在C#中,保证\ n为换行符(第2.4.4.4节)。当然,如果OP指定了平台,那就太好了……此外,我认为,这种详细程度对于那些只是问差异的人而言,比起有用的做法更令人困惑。

–乔恩·斯基特(Jon Skeet)
2012年3月2日0:00

@AdrianMcCarthy:但是至少在C#和Java中,它是换行符。它是U + 000A,由Unicode命名为“ LINE FEED”(和NEW LINE)。我将编辑提及C和C ++的特殊情况,但我真正相信这些是特殊情况,而不是相反。

–乔恩·斯基特(Jon Skeet)
2012年3月3日在21:45



#2 楼

在C和C ++中,\n是一个概念,\r是一个字符,而\r\n是(几乎总是)一个可移植性错误。打印头位于某行和某列中。当您将可打印的字符发送到电传打字机时,它将在当前位置打印该字符,并将信头移动到下一列。 (这在概念上与打字机相同,只是打字机通常相对于打印头移动纸张。)

当您要完成当前行并从下一行开始时,执行两个单独的步骤:


将打印头移回该行的开头,然后
将其向下移至下一行。

ASCII将这些动作编码为两个不同的控制字符:



\x0D(CR)将打印头移回到行首。 (Unicode将其编码为U+000D CARRIAGE RETURN。)

\x0A(LF)将打印头向下移动到下一行。 (Unicode将其编码为U+000A LINE FEED。)

在电传打字机和早期技术打印机时代,人们实际上利用了这是两个独立的操作这一事实。通过发送CR而不跟随LF,可以在已经打印的行上打印。这允许重音,粗体和下划线等效果。某些系统多次套印,以防止密码在硬拷贝中可见。在早期的串行CRT终端上,CR是控制光标位置以更新屏幕上已有文本的方法之一。

但是大多数时候,您实际上只是想转到下一个线。某些系统不需要一个控制字符,而只允许一个或另一个。例如:


Unix变体(包括Mac的现代版本)仅使用LF字符表示换行符。
旧的(OSX之前的)Macintosh文件仅使用CR表示换行符的字符。
VMS,CP / M,DOS,Windows和许多网络协议仍然期望两者:CR LF。使用NLCD上标准化的EBCDIC的旧IBM系统-甚至在ASCII字符集中也不存在的字符。在Unicode中,NL是U+0085 NEXT LINE,但是实际EBCDIC值是0x15。为什么不同的系统为什么选择不同的方法?只是因为没有通用标准。在您的键盘可能显示“ Enter”的地方,较旧的键盘曾经说“ Return”,这是回车的简称。实际上,在串行终端上,按Return键实际上会发送CR字符。如果您正在编写文本编辑器,那么很可能只使用从终端输入的那个字符。也许这就是为什么较旧的Mac只使用CR的原因。
现在我们有了标准,有更多种表示换行符的方法。尽管在野外极为罕见,但Unicode具有新的字符,例如:


代表一些最有用的控制代码,而无需担心底层字符集。 C有几个表示控制代码的转义序列: (用于换页)移动到下一页的开始

U+2028 LINE SEPARATOR(用于标签)将打印头移动到下一个水平标签位置

(此列表

此映射在编译时发生-编译器看到U+2029 PARAGRAPH SEPARATOR并放置了用于响铃的任何魔术值。

请注意,大多数助记符都与ASCII控制代码直接相关。例如,\a将映射到\f。可以为使用ASCII字符以外的其他字符作为主机字符集的系统编写编译器(例如EBCDIC)。具有特定助记符的大多数控制代码都可以映射到其他字符集中的控制代码。

Huzzah!可移植性!

,差不多。在C语言中,我可以编写\t使其响铃(或发出哔声)并输出一条消息。但是,如果我想在下一行中打印某些内容,那么我仍然需要知道主机平台转移到下一行输出所需要的内容。 CR LF? CR?如果? NL?还有吗C的可移植性非常重要。

C有两种I / O模式:二进制和文本。在二进制模式下,无论发送什么数据,都按原样发送。但是在文本模式下,有一个运行时转换功能,可以将特殊字符转换为主机平台换行所需的内容(反之亦然)。 />
好,这也依赖于实现,但是有一种独立于实现的方式来指定它:\a。它通常被称为“换行符”。

这是一个微妙但重要的要点:\a在编译时映射到实现定义的字符值,然后(在文本模式下)在运行时再次映射基础平台移至下一行所需的实际字符(或字符序列)所需的时间。

0x07 BEL与所有其他反斜杠文字不同,因为涉及两个映射。此两步映射使printf("\aHello, World!");甚至与\n都显着不同,\n只是到CR的编译时映射(或任何底层字符集中最相似的控制代码)。这绊倒了许多C和C ++程序员。如果要轮询其中的100个,则至少有99个告诉您\n表示换行。这并非完全正确。大多数(也许所有)C和C ++实现都将LF用作\n的神奇中间值,但这只是实现细节。编译器使用其他值是可行的。实际上,如果主机字符集不是ASCII的超集(例如,如果是EBCDIC),则\r几乎肯定不是LF。

因此,在C和C ++中:



\n实际上是回车符。换行语义。

\n几乎总是一个可移植性错误。在文本模式下,这会转换为CR,然后转换为平台的换行符序列-可能不是预期的。在二进制模式下,它将转换为CR,后跟一些不可为LF的不可思议值-可能不是预期的值。在二进制模式下做到这一点。大多数文本模式实现将像\n一样对待。


评论


试图弄清楚如何在Python中拆分