反斜杠n`\n`是否真的是换行符,但被视为换行符



多年来,我一直在使用C、Ruby、Perl、Java和PHP或许多其他语言,我只是把n当作换行符。所以事实证明它只是";换行符";但被视为";Newline"?

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

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

我认为两个主要的收获点是

  1. 我们确实没有换行符,但我们将n(即换行符)视为换行符,而大多数系统只是将此换行符视为"换行符";平均值;Newline
  2. 这真的是0x0a,只是为了澄清事实。多年来我一直以为它是0x0d,但事实并非如此

以上内容是否准确,是否有任何更正或添加?

现在有以下换行符("换行符"):

  • Old MacOS0x0D=13=CR=r=回车
  • Linux0x0A=10=LF=n=换行
  • AS4000x85=EBCDIC NL=NEL
  • Windows0x0D 0x0A=CR-LF=rn

CR、LF源于带持纸架的机械式打字机。由滑架右端的手柄引起的CR使滑架被释放回左侧。LF把车厢卷了两半。

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

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

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

这些实现值都是ASCII字符。它们是电传打字的产物。0x0d实际上导致滑架移动,因此打印的下一个字符位于第1列。0x0a实际上导致托架旋转了一行。

我以前在33型电传打字机上看到过这个:)

另一个术语可能会混淆的地方是ASCII NUL字符。它的值为0x00。您有时会在代码中看到它为"\0"。很多人把它称为NULL,这是C/C++中的一个指针值,其值通常为0。

我本想把它作为注释来写,但我做不到。

在阅读构建自己的文本编辑器教程时,我在修复Ctrl-M部分遇到了这个问题:

事实证明,终端正在帮助翻译任何车厢将用户输入的(13,'\r')返回到换行符(10,'\n')中。

稍后它谈到了输出处理:

事实证明,终端对输出侧。它将我们打印的每一行换行符("\n")翻译成回车后跟换行符("\r\n")。

如果你看一下白蚁的人(3),它会说:

ICRNL在输入时将回车转换为换行符(除非设置了IGNCR)。

OPOST启用实现定义的输出处理。

最新更新