【问题标题】:Is the backslash n `\n` really Line Feed, but is treated as a Newline?反斜杠 n `\n` 真的是换行符,但被视为换行符吗?
【发布时间】:2021-03-18 21:31:13
【问题描述】:

多年来使用 C、Ruby、Perl、Java 和 PHP 或许多其他语言,我只是将\n 表示换行符。原来它只是“换行”但被视为“换行”?

看起来以下是一些事实,其中一些来自the Wikipedia article

  1. \n 是换行符,而不是换行符,但几乎所有系统都将其视为“新行”。
  2. 理论上\r\n实际上就是换行符,因为它将光标水平移回第一个位置,并将光标向下移动一行。但是,尽管有些系统将其用作换行符 (Windows),但有些系统仅将单个 \n 视为换行符(Unix、Linux、Mac)。
  3. 有些系统实际上有换行符,例如在 IBM 大型机和 ZX80 上,但它从未变成 ASCII 字符,我们几乎从不使用它。
  4. 所以在 ASCII 中,我们实际上仍然只有回车 \r,即 0x0d(十进制 13)和换行 \n,即 0x0a(十进制 10)。
  5. 就编程而言,输出0x0a 字符意味着换行,尽管实际上它只是换行。
  6. 理论上,如果我们输出0x0a,可以说下一个输出将继续在与前一行相同的水平位置,而不是在最左边的位置,但实际上并非如此。在大多数系统上,它始终位于最左侧。
  7. \r 仍被某些程序用来保持在同一行输出信息而不向上滚动。尽管我们永远不知道要打印多少“空白空间”来掩盖旧信息,但这仍然有效。可以通过 ANSI 转义序列 \033[K 来完成从光标到行尾的清除,或者更正确地使用在该特定平台上运行的某些 curses 库来完成。

我认为两个主要的要点是

  1. 我们确实没有换行符,但我们将\n(即换行符)表示换行符,而大多数系统只是将此换行符视为“换行符”。
  2. 真的是0x0a,只是为了澄清事实。多年来我一直认为是0x0d,但事实并非如此。

以上是否准确,或是否有任何更正或补充?

【问题讨论】:

  • 归根结底,它只是一个字节,系统如何解释它取决于它们。这不是“真的”一回事。
  • 好吧,原因是有一次,我在一次采访中(在谷歌)被问到什么是换行符,什么是换行符,什么是回车符,什么是 \n\r ... 最好是直截了当
  • 据我所知,“换行符”是最常见的基于 CRLF 或 LF 和 CR 的视觉表现形式。控制字符的解释因操作系统和其他实现而异。

标签: ascii newline carriage-return linefeed


【解决方案1】:

现在有以下换行符(“换行符”):

  • Old MacOS 0x0D = 13 = CR = \r = 回车
  • Linux 0x0A = 10 = LF = \n = 换行
  • AS400 0x85 = EBCDIC NL = NEL
  • Windows 0x0D 0x0A = CR-LF = \r\n

CR、LF 源于带有纸架的机械式书写器。 由托架右端的手柄引起的 CR 导致托架被释放回左侧。 LF 把马车翻了两半。

像 Java 这样的语言采用了读取行的策略, 不传递换行符。它可以处理任何行尾。对于当前平台,它提供了一个保存实际换行符(行分隔符)的属性。

对于模式匹配,存在正则表达式 \R (Java "\\R") 来匹配任何换行符序列。

【讨论】:

  • 我尝试在 Mac 上用 Ruby 打印出\n,它给出了一个 0x0a... 我认为如果它是 Mac 上的 C 或 Java 可能相同。在 Windows 上,它可能会发出 0x0d 0x0a 仍然...
  • @nonopolarity 在java中\r,\n,\r\n是固定的\u000d,\u000a,\u000d\u000a。如您所说,在其他语言中,\n 可能在 Windows 上被重新解释为 0x0d 0x0a。这是 C 的可移植性度量,因为许多 C (Unix) 程序早于 Windows。现在的 Mac OS 是 Unix 家族的一部分,它的\n,
【解决方案2】:

New Line 是文本文件行终止符的抽象名称。在 Win 机器上,它被实现为 0x0d0a。在 Unix 机器上,它被实现为 0x0a。在旧 Mac 上,它被实现为 0x0d。

那些实现值都是 ASCII 字符。它们是从电传打字机继承而来的。 0x0d 实际上导致了小车移动,因此打印的下一个字符在第 1 列中。0x0a 实际上导致小车旋转一行。

我以前在Model 33 Teletype 上看到过这个:)

另一个容易混淆的地方是 ASCII NUL 字符。它的值是 0x00。您有时会在代码中将其视为“\0”。很多人把它称为NULL,它是C/C++中的一个指针值,其值通常为0。

【讨论】:

  • 因为 Mac 可以追溯到 1984 年,当提到老 Mac 时,是 1997 年、1998 年之前的 Mac,还是最近的 2007 年的 Mac?
  • 我没有日期。有一点他们基本上切换到了 Unix。什么时候发生 0x0d -> 0x0a。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-01
  • 2010-12-20
  • 1970-01-01
相关资源
最近更新 更多