怎样 \r\n 不同的?我认为这与 Unix 和 Linux 之间的关系有关。Windows 对比Mac,但我不确定它们到底有何不同,以及在正则表达式中搜索/匹配哪些。

有帮助吗?

解决方案

他们是不同的字符。 \r是回车,\n是换行。

在“旧”打印机,\r发送的打印头回行的开始,和通过\n一个线前进的文件内。两者都是因此,有必要从下一行开始打印。

显然,现在是有些无关紧要,但根据在控制台上你仍然可以使用\r移动到行的开始,并覆盖现有的文本。

更重要的是,UNIX倾向于使用\n作为线路分离器;视窗倾向于使用\r\n作为行分离器和Mac(最多OS 9)的使用使用\r作为在线分离器。 (Mac OS X的是Unix的Y,所以使用\n代替;可能存在其中\r使用虽然代替一些兼容性的情况下)

有关的更多信息,请参见维基百科换行符文章

编辑:这是语言敏感。在C#和Java,例如,\n 总是装置的Unicode U + 000A,其被定义为换行。在C和C ++的水是有点泥泞,作为含义是平台特定的。见征求意见的信息。

其他提示

在 C 和 C++ 中, \n 是一个概念, \r 是一个字符,并且 \r\n (几乎总是)一个可移植性错误。

想想老式的电传打字机。打印头位于某行、某列。当您向电传打字机发送可打印字符时,它会在当前位置打印该字符并将头部移动到下一列。(这在概念上与打字机相同,只是打字机通常相对于打印头移动纸张。)

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

  1. 将打印头移回行首,然后
  2. 将其移至下一行。

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。
  • 使用的旧 IBM 系统 EBCDIC NL 是一种甚至不存在于 ASCII 字符集中的字符。在 Unicode 中,NL 是 U+0085 NEXT LINE, ,但实际的 EBCDIC 值为 0x15.

为什么不同的系统选择不同的方法?很简单,因为没有通用标准。您的键盘可能会显示“Enter”,而旧键盘过去会显示“Return”,这是回车符的缩写。事实上,在串行终端上,按 Return 键实际上会发送 CR 字符。如果您正在编写一个文本编辑器,那么很容易只使用从终端输入的该字符。也许这就是为什么旧款 Mac 只使用 CR 的原因。

现在我们有了 标准, , 有 更多的 表示换行符的方法。虽然在野外极其罕见,但 Unicode 拥有新字符,例如:

  • U+2028 LINE SEPARATOR
  • U+2029 PARAGRAPH SEPARATOR

甚至在 Unicode 出现之前,程序员就希望用简单的方法来表示一些最有用的控制代码,而不必担心底层字符集。C 有几个用于表示控制代码的转义序列:

  • \a (用于警报)使电传打字机响铃或使终端发出蜂鸣声
  • \f (用于换页)移动到下一页的开头
  • \t (对于制表符)将打印头移动到下一个水平制表符位置

(此列表故意不完整。)

此映射发生在 编译时--编译器看到 \a 并放置任何用于敲响铃声的魔法值。

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

好哇!可移植性!

嗯,差不多了。在C中,我可以写 printf("\aHello, World!"); 它会响起铃声(或蜂鸣声)并输出一条消息。但如果我想在下一行打印一些内容,我仍然需要知道主机平台需要什么才能移动到下一行输出。CR LF?CR?如果?NL?还有别的事吗?便携性就这么多了。

C 有两种 I/O 模式:二进制和文本。在二进制模式下,无论发送什么数据都会按原样传输。但在文本模式下,有一个 运行 将特殊字符转换为主机平台新行所需的任何字符的翻译(反之亦然)。

太棒了,那么有什么特殊字符呢?

嗯,这也依赖于实现,但是有一种独立于实现的方法来指定它: \n. 。它通常称为“换行符”。

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

\n 与所有其他反斜杠文字不同,因为涉及两个映射。这种两步映射使得 \n 甚至与显着不同 \r, ,这只是到 CR(或无论底层字符集是什么的最相似的控制代码)的编译时映射。

这让许多 C 和 C++ 程序员感到困惑。如果你对其中 100 人进行民意调查,至少 99 人会告诉你 \n 表示换行。这并不完全正确。大多数(也许是所有)C 和 C++ 实现都使用 LF 作为神奇的中间值 \n, ,但这是一个实现细节。编译器使用不同的值是可行的。事实上,如果主机字符集不是 ASCII 的超集(例如,如果它是 EBCDIC),那么 \n 几乎肯定不会是 LF。

所以,在 C 和 C++ 中:

  • \r 字面意思是回车。
  • \n 是一个神奇的值,在文本模式下被翻译 运行 到/从主机平台的换行语义。
  • \r\n 几乎总是一个可移植性错误。在文本模式下,这会被转换为 CR,后跟平台的换行符序列——可能不是预期的那样。在二进制模式下,这会被转换为 CR,后跟一些神奇的值 也许不会 是 LF——可能不是预期的那样。
  • \x0A 是指示 ASCII LF 的最便携方法,但您只想在二进制模式下执行此操作。大多数文本模式实现都会将其视为 \n.
  • “ ” => 返回
  • “ n” => newline或lineFeed(语义)

  • 基于 Unix 的系统仅使用“ ”来结束一行文本。

  • Dos 使用“ ”来结束一行文本。
  • 其他一些机器只使用“ ”。(Commodore、Apple II、OS X 之前的 Mac 操作系统等..)

在短\ r的ASCII值13(CR)和\ n具有ASCII值10(LF)。 Mac使用CR作为行分隔符(至少,它没有之前,我不知道现代MACS),* nix中使用LF和Windows同时使用(CRLF)。

\r用来指向一个行的开始,并且可以从那里替换文本,e.g。

main()
{
printf("\nab");
printf("\bsi");
printf("\rha");
}

产生这样的输出:

hai

\n为新行。

在除了@乔恩碟的回答是:

传统的Windows使用了\ r \ n,UNIX \ n和Mac \ R,但较新的Mac上使用\ n,因为它们可以基于Unix。

在C#我发现他们在一个字符串使用\ r \ n

\ r是回车; \ n是新行(换行)......在OS上取决于以各自的含义。阅读这篇文章上“\ n”和之间的区别'\ r \ n' ...用C

\用于回车河(ASCII值是13) \ n用于新的生产线。 (ASCII值为10)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top