回车和换行的顺序

43

在文本编辑器中,回车和换行符的顺序很重要吗?它们出现的顺序是否有所影响?

例如,与其是:

\r\n
这个页面中的内容只包含了一个段落标签。
\n\r

看起来Jeff已经写了一篇非常好的有关该主题的博客文章


博客文章链接已经失效了。这是原始的博客文章吗?http://blog.codinghorror.com/the-great-newline-schism/ - Fls'Zen
感谢 @flszen,链接已更新。 - Chad
首先,我有记不住正确顺序的问题,直到我意识到"\r\n"可以记作“RN”,其中RN是注册护士的缩写。另外请注意,字符CRLF是互联网的标准;它们至少是电子邮件的标准行尾。 - Sam Hobbs
5个回答

50

传统的顺序是先回车,然后换行,当两个控制字符都被使用时。

这个原因可以追溯到旧的ASR-33电传打字机。

当向ASR-33发送回车指令时,如果打印头靠近右边界,它需要花费十分之一秒的时间返回到左边界,而且在撞到左边界时会有一点"弹跳"。

如果顺序是先换行,再回车,那么第一个打印字符可能会在回车之后的十分之一秒出现,从而可能会印在页面的中间(作为一条污渍)。但是如果换行在回车之后,则换行所花费的时间提供了额外的时间让打印头完成行程。

一些系统(例如旧的Xerox Sigma 7操作系统)采用换行然后回车的顺序,但是它们会在数据流中插入空字符来让打印头完成操作。

当涉及到更快的设备(例如一些早期的30字符每秒电传打字机)时,问题会变得更加严重,需要采用更复杂的策略。

还有一点,在用户输入中,回车符由用户按下回车键提供,而换行符必须由计算机提供。因此,通常“风格”是使普通打印行以换行符开头,并以回车符结尾。因此,提示用户输入只包含一个换行符,而用户输入以回车符结束。这种方案在一贯使用时效果很好,但当然并非总是如此。


1
更重要的是,在现代计算机中,LFCR 可能会被误解为两个新行。 - Sam Hobbs
1
在异步通信的早期,<CR><LF>(\r\n)序列总是后跟一堆NUL(x00),这些NUL会在回车后等待真正数据的接收设备中被丢弃。如果没有NUL,当回车返回到右边缘时,如果有真正的字符到达,则无法打印并且将丢失字符。 NUL是“空闲字符”,无论它们是否被“打印”都没有关系。 NUL的数量取决于线路速度(300、1200、2400 bps等)。 - Pierre
@Pierre - 这通常只适用于超过110波特(ASR-33 TTY速度)的数据速率。 - Hot Licks
抱歉,应该是“左”边距。 - Pierre
2
我认为问题的作者并不关心历史原因,更重要的是知道为什么今天要使用\r\n而不是\n\r - Finesse

26

有三种常见的换行格式:

  • \r\n 用于DOS\Windows世界
  • \r 用于早期的Mac系统(OSX之前)
  • \n 用于Unix和类Unix世界

\n\r 在我所知道的任何地方都不是标准,通常会导致编辑器将其视为Unix格式的文本文件,然后它将把奇怪的\r字符显示为文本。

历史上,\r表示回车符(CR, ASCII码13),这指的是旧式打字机,在这种打字机上,您需要将打印头推回到最左边,以将光标返回到该行的开头。 \n表示换行符(LF, ASCII码10),它将字符向下移动一页一个字符。虽然这可能很有趣,但通常并不重要 - 只需使用适合当前平台的换行格式即可。


5
作为关于回车和换行符研究的跟进,以下是内容:
使用NotePad时,当找到CR+LF字符时它会检测到行尾。这是CP/M、MS-DOS和Win32通用的格式。来源 Unix在找到LF时检测到行尾。
Apple在找到CR时检测到行尾。
从Uni-Code角度来看,有一个叫做NEXT LINE (NEL)的控制字符,使情况更加复杂。
在C编程语言中,为什么给它一个换行符就会输出回车+换行符呢?例如:

printf("hello World\n")。
C编程语言和Unix操作系统重新定义了换行符作为新行符,意图是stdio库将转换新行字符以便实际在该平台上跳到下一行的开头,例如Win32的回车+换行。因此,当您在Windows或Linux上使用C / C++编写换行符(实际上是LF字符)时,stdio库会确定需要输出到该平台的行尾格式。这在C程序中创建二进制文件或文本文件时很明显。如果指定要写入二进制文件,则stdio库将保留该平台的输出格式不变。因此,在将数据写入文件时,遇到换行符时,它将不会插入特定于平台的换行符。但即使您按照Win32的回车+换行规则进行编写,例如将以下内容作为纯二进制文件写入文件,如MyText \n MyText \n MyText,也不能保证它会在文本编辑器中呈现为:
 MyText 
      MyText 
            MyText 

大多数编辑器将其呈现为以下形式。

MyText 
MyText 
MyText

混淆的原因主要是因为C标准在两个不同的含义上使用换行符\n。首先,它作为STIO库的换行指示符转换为操作系统的新行格式(Win32上为CR + LF,Linux上为LF,Apple上为CR)。其次,它表示十六进制值中的换行符。


在Win3.1、95、98和XP上尝试了不同的方法后,经过10次修改,我得出结论:我找不到一个可以独立使用CR和LF并且可以在同一文档中使用它们的应用程序。大多数文本编辑器在遇到单个CR或LF时都会显示一个方块。更聪明的文本编辑器将根据所在平台查找CR+LF/LF/CR文件格式。

大多数编辑器只关心向用户呈现新行,并会在不同的文件格式之间切换。因此,如果您很快就要编写词法分析器和字符串标记化器,并担心何时检测新行。最好是在较低的级别上检测文件格式(CR+LF Win32,LF Linux,CR Apple)以增加行号。或者使用ReadLine功能,该功能将考虑到这一点。

令人困惑的是,IBM和Win32采用回车符+换行符作为指示文本编辑器呈现新行的标准。事实上,这是多余的。我找不到一个单独使用回车符+换行符来呈现或使用其实际名称的应用程序。

所以,如果你是一名撰写新文本编辑器想要惊艳世界的大学生。自动检测文件格式,并不用担心CR+LF所给出的实际技术含义。


5

(抱歉打扰一下,但这是有关此问题的搜索结果的主要结果)

在Notepad++中,这很重要。当您以换行符\n开头,然后是回车符\r时,您的换行符将出现在下一行。因此,顺序应为:CR LF。

enter image description here


1

有很多换行符转换器可供选择。

例如 这个。它们可以为您完成大部分工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接