首页 > 解决方案 > 反斜杠 n `\n` 真的是换行符,但被视为换行符吗?

问题描述

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

看起来以下是一些事实,其中一些来自维基百科文章

  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但事实并非如此。

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

标签: asciinewlinecarriage-returnlinefeed

解决方案


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

  • 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") 来匹配任何换行符序列。


推荐阅读