换行符来自老式打字机,如下图所示:
老式打字机有一个类似喷头的结构(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
直接替换为空。