是的,我知道'\n'在UNIX中写入换行符,而对于Windows,则有两个字符序列:'\r\n'。从理论上讲,所有这些都很好,但是我的问题是为什么?为什么在Windows中回车符是多余的?如果UNIX可以在\n中做到这一点,为什么Windows却需要两个字符来完成?

我正在阅读David Beazley的Python书,他说:
两个字符的序列'\ r \ n'(和
读回文件时,'\ r \ n'被翻译回单个'\ n'
字符)。为什么要加倍努力呢?

老实说。我很早就知道它们之间的区别,但是从来没有问过为什么。希望今天能回答。

谢谢您的时间。

评论

还应注意,Windows并不是唯一使用\ r \ n的计算机。大多数基于文本的Internet协议(例如SMTP,HTTP等)也使用它,其原因与Windows(例如历史记录)大致相同。

另外,在Java中并使用格式字符串(例如System.out.printf()或String.format())时,请确保将%n用作CRLF,以实现操作系统兼容性。 \ n已弃用。

我已经看过\ n \ r次。 (我认为是NetWare提供的。)

SO的相关问题:不同行在不同平台结束的历史原因

很少有Windows程序实际需要CRLF。 CRLF可能是默认值,但是几乎所有东西都可以自动检测并使用LF即可。我已将Windows上的所有文本编辑器配置为对所有新文件使用LF,这确实不是问题。

#1 楼

向后相容。事故)之所以使用CR-LF约定,是因为这是驱动打印机的方式(因为打印机最初是计算机控制的打字机)。

打印机有一个单独的命令,可将纸张向上移动一行到新行,还有一个单独的命令,用于将笔架(安装纸张的位置)返回左边缘。

这就是为什么。而且,是的,这很烦人,但这是一揽子交易的一部分,该交易使MS-DOS可以胜过CP / M,Windows 95可以胜过DOS之上的所有其他GUI,Windows XP可以取代从Windows 98开始。

(注意:现代激光打印机仍然具有这些命令,因为它们也与早期打印机向后兼容-特别是HP做到这一点)

对于那些不熟悉的人以下是有关打字机的视频,展示了打字的方式:http://www.youtube.com/watch?v = LJvGiU_UyEQ。请注意,即使纸张移动很简单,也要先将其向上移动,然后再将其退回。叮叮通知打字员结束将至,并为此做准备。

评论


Unix如何使用\ n仅与那些过去的打印机一起使用?我以为他们确实将Unix控制台连接到打字机类型的打印机?

– Senthil Kumaran
2010-12-23在5:51

@Senthil,在Unix中,换行符由最终驱动程序转换。这只是一个不同的设计决定。

–user1249
2010-12-23在16:59

确切地说,@ Senthil在Unix中,打印机和终端在操作系统中是抽象的,它们的描述确定了为设备生成哪些字节序列。 CP / M没有这样的抽象,而是全部留给程序运行-这很可能是因为并非所有程序都需要它,因此在驻留的操作系统中拥有它会从不需要它的程序中夺走宝贵的内存。请记住,CP / M是为16千字节系统设计的。

–user1249
2011-2-26在12:12

“因此,可以说是世界上最先进的运输系统的主要设计特征最初是由马鞍的宽度决定的。”软件也是如此。 astrodigital.org/space/stshorse.html

– Ryan Michela
2011年7月1日19:28



@Ryan,城市传奇。在snopes.com/history/american/gauge.htm中揭穿

–user1249
2011年7月1日19:40

#2 楼

据我所知,这可以追溯到打字机的时代。您的文化)

\r是换行符,它将使您的纸张向上移动。

计算机问世时,我猜有些人保留了旧模型,但其他人意识到这是不必要的,并将完整的换行符封装为一个字符。

评论


那么,为什么Windows仍然坚持呢?

– Sukhbir
2010-12-22 11:45

向后兼容。想象一下,如果现在更改文本文件,将会破坏多少个文本文件

–马特·艾伦(Matt Ellen)
2010-12-22 11:47

严格来说,这里的“ oddball”是unixoid的“仅使用换行符”,最初(我认为)是为了减少存储的字符数(在终端驱动程序中完成CR LF的转换,这是“ onlcr”标志)控制它的输出。

–疫苗
2010-12-22 11:50

Windows有一个名为DOS的前身,具有相同的行尾。 Windows保持兼容性。 DOS本身具有前身,即CP / M。那也使用CRLF。 DOS保持兼容性。 CP / M的发展受到DECs TOPS的影响。您可以猜测,他们使用了哪种线尾。 :-)兼容性说明了很多。

–Mnementh
2010-12-22 12:03

可以,但是记事本为什么仍不能识别“ \ n”行尾?

– dan04
2011-2-20在10:06

#3 楼

我不知道这是否是常识,但是应该指出,现代终端仿真器仍然可以理解CR:



$ printf "hey world\rsup\n"
sup world


评论


在旧的IBM行式打印机(例如1403)上,惯例是将行缓冲区的第一个字符视为回车控制字符。空白表示前进一行并打印。加号表示省略间距,并用于例如下划线。零表示双倍空格,负表示三倍空格。下一页顶部隔开一个“ 1”,其他数字前进到用户定义的垂直位置(用于填写预打印的表格)。

–乔治
19年1月23日在21:10

#4 楼

从历史上看,换行意味着压板(您在其上输入的滚轮)旋转了一行,导致文本显示在下一行...但在下一列中。

回车表示“返回

Windows使用CR + LF,因为MS-DOS这样做了,因为CP / M这样做了,因为它对于串行行有意义。

Unix复制了\ n约定,因为Multics这么做了。

我怀疑如果深入研究,您会发现实现者之间存在政治分歧!

(您省去了额外的乐趣,在Mac约定中(或曾经是Mac约定)仅使用CR来分隔行。现在Unicode也具有自己的行分隔符U + 2028!)

评论


哇!不知道Mac ...

– Michael K
2010-12-22 13:54

我不确定您是否会发现政治分歧。您也可能会发现人们独立做类似的事情。

– David Thornley
2010-12-22 15:09

何时涉及不同的标准机构?我很惊讶没有找到政治原因!

–坦率的剪毛
2010-12-22 15:19

#5 楼

换行符的历史(维基百科):ASCII是ISO和ASA(ANSI的前身组织)同时开发的。在1963年至1968年期间,ISO草案标准仅支持将CR + LF或LF用作换行符,而ASA草案仅支持CR + LF。
CR + LF序列是常用的在许多采用电传打字机(通常为ASR33)作为控制台设备的早期计算机系统上,因为需要按此顺序将这些打印机放置在新生产线的开头。在这些系统上,通常会常规编写文本以使其与这些打印机兼容,因为尚未很好地开发出从应用程序中隐藏此类硬件细节的设备驱动程序的概念;应用程序必须直接与电传打字机对话并遵守其约定。
两个功能的分离掩盖了一个事实,即打印头无法在一个字符的时间内从最右边返回到下一行的开头。 。这就是为什么总是先将CR与序列一起发送的原因。实际上,通常有必要发送额外的字符(外部CR或NUL忽略),以使打印头有时间移到左边距。 ,许多操作系统仍支持自动发送这些填充字符,以便与需要多个字符时间才能滚动显示的廉价终端兼容。
MS-DOS(1981)采用了CP / M的CR + LF。 CP / M使用CR + LF对于通过串行线使用计算机终端很有意义。此约定由Microsoft的更高版本的Windows操作系统继承。
Multics操作系统于1964年开始开发,仅使用LF作为其换行符。 Unix遵循Multics惯例,后来的系统遵循Unix。


评论


在旧的IBM 2741打印机键盘终端上,打印机组件是IBM Selectric弹跳式球形打字机。更改为大写字母会导致球旋转,这需要花费更多时间。在EBCDIC字符代码中,大写字符的位置6为1位。因此,EBCDIC空白(0x40)为大写!如果要打印较长的文档(例如论文),则可以通过将小写单词之间的空格转换为NUL或小写空格(它们使用不同的字符,如果有记忆,则使用IL)来引入必要的延迟,从而从实质上提高输出速度,返回或跳格时)。

–乔治
19年1月23日在22:14

#6 楼

人们问“为什么Unix为什么能做\n而不是Windows”是什么意思?这是一个奇怪的问题。


操作系统几乎与它无关。应用,库,协议和文件格式如何处理问题更多。除了操作系统读取/写入基于文本的配置或命令行命令的位置以外,对操作系统进行故障也没有任何意义。
大多数Windows应用程序都可以读取\n\r\n。他们还输出\r\n,让每个人都很高兴。程序不能简单地“做” \n\r\n,它既可以接受一个,也可以接受两者,并输出一个或另一个,或者两者兼而有之。实际上,每种语言/平台都具有编写正确的终端行和最可靠地阅读的功能。我唯一需要解决的问题是当我编写HTTP服务器时-这是因为某个浏览器(提示:IE之后的第二个最受欢迎的浏览器)在执行\n而不是正确的\r\n。 />更相关的问题是,为什么这么多现代Unix应用程序仅在知道有些协议和程序不喜欢的情况下才输出\n

评论


另一个相关的问题:由于许多协议主要是在Unix系统上开发的,因此为什么不使用'\ n'?

– David Thornley
2010-12-22 15:11

@DavidThornley因为\ r \ n更可能跨平台工作(对于较旧的Mac为\ r,对于Windows为\ r \ n,对于* nix为\ n)。

–基本
15年3月30日在1:59

#7 楼

约定在其各种系统上(在unix类型的系统上为\ n,在Windows上为\ r \ n等)保留的原因是,一旦选择了约定,就无法在不破坏人们文件的情况下对其进行更改。

(很早以前)就使用各种电传打字机模型开发了Unix类型的系统,有人决定在进行换行时设备应该回车。 br />
Windows来自DOS,所以对于Windows来说,问题实际上是:为什么DOS使用此cr / lf序列?我猜想它与CP / M有关,而DOS正是CP / M的根源。再次,电传打字机的特定模型可能起到了作用。

评论


嗯,很有趣。

– Sukhbir
2010-12-22在12:00

Windows为什么不能处理以\ n结尾的行,但现在仍继续使用\ r \ n?如果他们从Windows XP开始执行此操作,则现在可以开始使用\ n而不是\ r \ n保存文件。

–心怀不满的山羊
2010-12-22 13:13

Windows与它无关。这是应用程序的决定,大多数应用程序都会同时读取“ \ n”和“ \ r \ n”,并写入“ \ r \ n”,所以每个人都很高兴。

–宫阪丽
2010-12-22 14:34

#8 楼

这是来自Microsoft的最佳来源的答案。
为什么行终止符CR + LF? CR代表
“回车”-CR控制字符将打印头
(“回车”)返回到第0列,而不会前进纸。 LF表示
“换行”-LF控制字符使纸张前进了一行
而无需移动打印头。因此,如果您想将打印头返回到第零列(准备打印下一行)并前进
纸(以便在新纸上打印),则需要CR和LF。
如果转到各种Internet协议文档,例如RFC 0821
(SMTP),RFC 1939(POP),RFC 2060(IMAP)或RFC 2616(HTTP),您将
看到他们都指定CR + LF作为线路终止顺序。因此,真正的问题不是“为什么CP / M,MS-DOS和Win32为什么使用CR + LF作为行终止符?”而是“为什么其他人为什么选择与这些标准文档有所不同并使用其他行终止符?”
Unix采用普通LF作为行终止顺序。如果查看
stty选项,您会看到onlcr选项指定是否应将
获取ststaffte文本,在其中
each
    line
        begins

上一行保留。因此,即使是unix,当处于原始模式时,
也需要CR + LF终止行。 LF之前的隐式CR是unix
的发明,可能是一种节约,因为它每行节省一个字节。
C语言的unix祖先将此约定引入了C
语言标准中。 ,只需“ \ n”(对LF进行编码)来终止行,这给运行时库带来了负担,可以将原始文件数据转换为逻辑行。术语“换行符”表示“通用行终止符”的概念。有人告诉我ASCII
委员会在1996年左右将字符0x0A的名称更改为“换行符”,
因此混乱程度进一步提高了。