回车与换行

在看早期的串口自定义协议的时候,经常两个结束符回车(CR)和换行(LF,很好奇为什么用这两个字符,就查了一下,搜到下面的说法。

在很久以前,有一种叫做电传打字机的机器,那时候还没有计算机。在这种打字机上,有一个叫Carriage的部件,它是打字头,相当于打字机的光标。每输入一个字符,光标就会前进一格。当输入的字符满一行后,光标重新从下一行的最左边开始打印。这个时候会触发两个动作,一个是把光标在垂直方向上向下移,一个是在水平方向上把光标移动到最左边。然后这种打字机每秒可以打10个字符,相当于0.1秒打一个字符;而要完成这两个动作需要花费0.2秒的时间,如果在这0.2秒中,有新的字符传过来的话,那么这些字符将会丢失。为了解决这个字符丢失的问题,研制人员就在每行的后面添加了两个表示一行结束的字符:一个叫回车(carriage return),相当于告诉打字机,把光标在水平方向上移到最左边;一个叫换行(line feed),相当于告诉打字机,在垂直方向上把光标移动到下一行。这就是回车和换行的由来。

后来,计算机出现了,这两个概念也被拿了过来。但是那时候储存设备非常昂贵,一些人认为用两个字符用来表示一行的结尾非常浪费,于是产生了分支,不同的厂商有不同的处理方法。在这些操作系统中,Unix操作系统每行结尾只有换行,即\n;Windows则是回车+换行,即”\r\n”;而Mac系统里则使用回车来代表结尾,即”\r”。正是这个原因,才会导致我们有时用Windows系统来打开Unix/Mac系统的文件时,会出现所有文字变成一行的情况,而用Unix和Mac系统打开Windows系统的文件时,在每一行的结尾会多出一个^M的字符。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注