换行符来自老式打字机,如下图所示: 老式打字机

老式打字机有一个类似喷头的结构(carriage),作用是将对应字符印到纸上。通常的文字都是从左往右,从上往下排版,随著打字进行,一行结束之后,需要如下操作:

  • 纸张(向上)滚动一行,喂新一行,line feed(lf)
  • carriage 回到最左边位置 carriage return(cr)

这两个操作都要进行,它们的功能并不是在纸上显示字符,而是调节 carriage 的位置。在键盘上,只需要按一个回车(enter)就能实现两个操作。

到了电子计算机时代,键盘参考了早期设计,这两个符号被保留下来,编入了 ascii 码中:

  • \n 来表示(向上)滚动一行
  • \r 表示 carriage 回到最左边

这两个字符都占一个长度。但早期计算机存储非常昂贵,两个字符表示换行符占据空间太多,不同系统就有了自己的设计:

简写 全名 符号 系统 记忆方式
cr carriage return \r mac mac 中有 c
lf line feed \n linux linux 也是以 l 开头的
crlf carriage return line feed \n\r Windows microsoft 先是 cr 再是 f

Windows 上的文件,直接拿到 Linux 上使用,在每行最后出现一个^M,这就是cr显示的样子。crlf中的lf做了换行符,cr^M的形式显示出来。解决办法就是把cr直接替换为空。