文字行的末尾
通常,操作系统使用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?》
1.《打印机的页面怎么换行打字?总结很全面速看!关于换行符的解释》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《打印机的页面怎么换行打字?总结很全面速看!关于换行符的解释》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/why/2969269.html