首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

关于换行符的解释

一行文字的结束符

通常,在操作系统中,会使用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?》

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20210105A0G39700?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券