\r 与 \n 的区别

我们都知道在 Linux 系统中使用 \n 表示下一行行首的位置,而在 Windows 中同样的含义却是使用 \r\n 表示,这是为什么呢?

\r 全称 Carriage Return,简称 CR,中文翻译回车,表示输入指针回到当前行行首(注意这里和我们平时认知中的回车含义不同)

\n 全称 Line Feed,简称 LF,中文翻译换行,表示输入指针换到下一行(不一定是下一行行首)

\r\n 其实就是表示两步操作,先回到行首,再往下移一行,最终的效果就是输入指针到了下一行行首。之所以这么设计,是有历史原因的,早期的打字机是机械式设备,对于可视字符由左向右依次打印,对于控制字符,则相应的做出调整。比如 \r 字符就是把打印指针移到最左侧,\n 字符就是把纸张上移一行(其实也就相当于把打印指针下移一行),而这两个字符放到一起就实现了打印机开始在下一行打印的功能。

后来计算机发展起来了,但早期的存储资源很是稀缺,而使用两个字符表示换到下一行行首有点不划算,所以 Linux 系列的操作系统决定使用 \n 这一个字符来表示这一含义。而 Windows 则保留了传统的做法。

下面有个小例子来描述 \r 的效果:

// 需要在 Terminal 终端中测试,浏览器的 Console 中没有效果
console.log("abc\rcba") // cba

因为 \r 表示回到当前行行首,所以后面的 cba 就覆盖了缓冲区中的 abc,最终的打印结果也是 cba