关于换行符的解释

关于换行符的解释

作者:BlogUpdater |  时间:2021-01-05 |  浏览:1010 |  评论已关闭 条评论

一行文字的结束符
通常,在操作系统中,会使用CR+LF会表达一行文本的结束。
这个惯例的起源,来自于电传打印机那个时代。
CR控制字符会将打印机的印刷头(也叫做Carriage)移动到行首(第0列),同时不会进纸。
而LF控制字符会进一行纸,同时不会移动印刷头。

所以,如果你想要将印刷头移动到行首(这样打印机会另起一行),同时进纸的话,则你需要同时发送CR和LF这两个控制字符。

如果你研究过各种RFC协议文档,例如RFC0821(SMTP), RFC1939(POP), RFC2060(IMAP)或者RFC2616(HTTP),则你会发现:它们都在文档里使用了CR+LF作为一行的结束符。所以,真正的问题不是:为什么操作系统使用CR+LF作为行结束符,而是:为什么还有其他一些人使用与标准文档不同的行结束符。

Unix操作系统接受LF作为行结束符。如果你仔细地研究一下stty工具的说明文档,你会发现:onlcr选项指明了是否将一个LF字符转换为CR+LF序列。
如果你正确地使用此设定,则你会得到类似如下的递进式文本:

因为这些文本行都没有将输入移动到行首。所以即使是Unix操作系统,当处于原始模式时,都会要求CR+LF作为行结束符。一个隐含的CR字符会放在LF前面,这可能是Unix的一个不同之处,另一方面,它也比较”经济”,因为每行只需要一个字符作为行结束符。

Unix中的C语言将这一转换带到了标准C语言中,也即:它会要求在行尾添加一个”\n”(就是LF的编码)字符,然后将LF转换为CR+LF的任务就丢给了运行时库来做。

在C语言中,还引入了一个名词”newline”来表达一个通用的行结束符。我听说ASCII委员会在1996年左右将字符0x0A作为”newline”的编码,所以,这就更加让人迷惑了。

总结
请记得:\n是一个转义字符,表示LF,而\r则表示回车(CR)。
所以,在Unix系统里,只使用\n,而在Windows里,使用\r\n作为行结束符。
这就会导致这样一个结果:Unix碰到\n时,会进行CR+LF操作,而单单一个\r(CR)不会进行换行,而是显示为一个控制字符(^M)。
在Windows中,需要使用”\r\n”来进行换行,如果只使用\n或者只使用\r,或者它们顺序不对,都会导致换行失败。
以上内容,又进一步解释了这样一个现象:
Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;
Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。

真乃:傻傻分不清楚啊。

最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Why is the line terminator CR+LF?》

标签:

评论已关闭。