在Linux和Windows上\ n和\ r的处理方式有何不同?


22

我认为\n将针向下\r移动,然后将针移动到一行的开头(左对齐)?不过,我不确定。所以,如果我错了,请纠正我。

无论如何,我被告知,Windows和Linux手柄newlinescarriage returns不同。我想知道他们如何不同地处理它们,以及在某些重要的地方要记住。谢谢回答。


到目前为止,我知道这\r\n在Windows 中是可以的,但\n\r不是。我记得,因为这\r\n是注册护士的首字母缩写。我还听说\n人们在Linux中使用的\r是它,而不是为了和Linux 相同的目的而被单独使用\r\n\r用于真正的旧MacOS。不过,我尚未证实这些事实。
千里ちゃん2012年

4
请勿将它们称为\r\n,因为\n处理方式取决于您在哪里使用它。更好的给他们打电话CRLF
Ignacio Vazquez-Abrams'1

伊格纳西奥,那些首字母缩略词对我没有意义。你把这个称作什么 :/?哦,行进给和回车。谢谢,sleske。
千里ちゃん

@ IgnacioVazquez-Abrams \ n与LF不同吗?在任何ASCII图表上,不是字符13 = \ n = LF吗?
barlop 2012年

1
@barlop:在Windows中输出时不在C中。
Ignacio Vazquez-Abrams'1

Answers:


21

我认为\ n将针向下移动,而\ r将针移动到一行的开头(左对齐)?不过我不确定

这或多或少是对的,但主要是历史上的好奇心。最初,在打印机和硬拷贝终端(电传打印机)上,使用换行(LF)将纸张前进一行。回车(CR)使打印头返回到行的开头。

当在“文本模式”下使用时,这可能仍可在现代打印机上使用,但如今已不那么重要了。

无论如何,有人告诉我Windows和Linux处理换行符和回车符的方式不同。

区别很简单:操作系统设计人员必须选择如何用计算机文件中的文本表示新行的开头。由于各种历史原因,在Unix / Linux世界中,选择了一个LF字符作为换行符;MS-DOS选择了CR + LF,Windows继承了它。因此,不同的平台使用不同的约定。

实际上,这已成为越来越少的问题。换行标记实际上仅与处理“纯文本”的图形有关,并且数量不多-它仅影响程序源代码,配置文件以及带有文档的一些简单文本文件。如今,大多数处理这类文件的程序(编辑器,编译器等)都可以处理换行符,因此选择哪一个都不重要。

在某些情况下,工具坚持使用“其”换行符约定(例如,Unix shell脚本不得使用CR + LF),在这种情况下,您必须使用正确的约定。


相同的问题:编程语言是否识别\n\r并且\n相同?例如,如果我解析已编辑别人的电脑上,并包含在Linux和Windows版本换行符的两个文本文件,就执行preg_match\n,并\n\r给我不同的结果?
千里ちゃん2012年

@千里ちゃん:这完全取决于编程语言,编译器等。特别是,如果您使用正则表达式,则将取决于您使用的正则表达式引擎-有些区别不同的行尾,有些则不行(大多数可以以任何方式配置,我相信)。
sleske 2012年

@千里ちゃん:如果您对某些系统/编程语言/正则表达式引擎如何处理不同的换行符约定有疑问,只需将其作为一个单独的问题提出。
sleske 2012年

您应该按照正确的方式来写\ r \ n。对于编程语言,他们将能够读取单个字符,并且程序员可以看到输入中使用了哪个字符,并且程序员也可以根据需要对输出进行操作。正如您可能会说“先写ABC,后跟\ r \ r \ r \ n”一样,然后在结尾加上任何要粘贴的字符!其他一些字符可能是不可打印的,也没有图形或其他内容。他们可能有一些内置函数,例如println,它们在新行中使用的是一个或另一个,不能两者兼有。
barlop 2012年

@千里ちゃん和某些编程语言可以让您在其内置函数之一中选择哪个结尾作为设置,因此,即使在内置函数中,从理论上讲您仍然可以。+如前所述,在实践中,您可以编写所需的任何行尾...尽管您可能无法像println函数那样有效地完成此操作。
barlop 2012年

13

CR和LF

美国信息交换标准码(ASCII)定义了控制字符,包括(现在仍然)用来控制打印机上打印位置的CARRIAGE-RETURN(CR)和LINE-FEED(LF)。机械打字机,早于早期的计算机打印机。

平台依赖性

在Windows中,文本文件中的传统行分隔符是CR,后跟LF

在旧的(OSX之前的)Apple Macintosh系统中,文本文件中的传统行分隔符为CR

在Unix和Linux中,文本文件中的传统行分隔符为LF。

\ n和\ r

在许多编程和脚本语言中,语言\n意味着“换行”。有时(但不总是),这意味着ASCII LINE-FEED字符(LF),正如您所说的那样,将光标(或打印位置)向下移动了一行。在打印机或打字机中,这实际上会将纸张向上移动一行。

始终\r是指ASCII CARRIAGE-RETURN字符(CR),其名称实际上来自机械打字机,那里有一个回车键,该键使携带纸张的滚轮(“支架”)在靠弹簧的作用下向右移动,尽其所能。因此,将当前打字位置设置在左边距。

程序设计

在某些编程语言\n中,其含义可能是平台相关的字符序列,这些字符在文本文件中结束或分隔成一行。例如,在Perl中,print "\n"Linux上的字符序列与Windows上的字符序列不同。

在Java中,最好不要使用\n或根本不使用运行时平台的本机行结尾\r。您应该使用System.getProperty("line.separator")。无论平台如何,都应使用LF和CR,\n\r在其上使用LF和CR(例如,在HTTP,FTP和其他Internet通信协议中使用)。

Unix风格

在Unix Shell中,该stty命令可用于使Shell在这些各种约定之间转换。例如,stty -onlcr将导致外壳随后将所有传出的LF转换为CR LF。

Linux和OSX遵循Unix约定

文字档

文本文件仍然非常重要并得到广泛使用。例如,HTML和XML是文本文件的示例。大多数重要的Internet协议(例如HTTP)都遵循文本文件约定,并包含行尾规范。

打印机

除了最便宜的打印机以外,大多数打印机仍然尊重CR和LF。实际上,它们是最广泛使用的页面描述语言(PCL和Postscript)的基础。


1
关于Java的注意事项:通常不应该完全不使用\ n或\ r。只是在Java中,“ \ n”始终为LF,而“ \ r”始终为CR。这可能就是您想要的:如果您想要特定的行结束样式,请使用它们;如果要明确你正在运行的计算机的本机行结束,然后使用line.separator。这实际上取决于您想要什么。
sleske 2012年

而且BTW println()自动使用line.separator,因此,如果您想要本机的行尾,则可以使用println()(并且,如果您需要某种特定类型的行尾,则不要使用它,而是显式地使用“ \ n”等)。
sleske 2012年

@sleske:好点。我将相应地更新答案。
RedGrittyBrick 2012年

1
是否有任何语言或编译器\n的控制字符不是ASCII LF(基于EBCDIC的系统除外)?我指的\n是字符串或字符文字中的含义,而不是指将其发送到文件或输出设备的效果。
基思·汤普森

1
@KeithThompson:对于Java:是的,\n始终是ASCII(和Unicode)代码10,因为JLS如此明确地指出(JLS 3.10.6,“字符和字符串文字的转义序列”-我检查了:-))。对于其他语言-好问题。
sleske 2012年

4

简而言之,这是打印机所需要的,但是现在,操作系统的操作略有不同。在大多数情况下,只需同时执行CR和LF就可以了,\r\n并且在大多数情况下,这样做会很好。


Linux只是忽略\r还是会导致某种行为改变?
亚伦·弗兰克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.