阿里云双十一优惠活动,点击链接进行购买: 一年仅需89元即可以购买服务器~。我个人服务器为2核4G配置,也更加推荐购买 2核4G三年799元 配置的服务器。
你可以跟着我的笔记 当我有一台服务器时,我做了什么 来开始维护服务器并搭建应用,将引导你使用 docker 和 k8s 搭建一个自己的服务器开发集群。

# 换行符 LF(\n) 与 CRLF(\r\n)

最近遇到了很多 \n\r\n 的问题,虽然一直知道他们都是换行符,但也没有细究,今天顺手查了下。

首先,要了解 \n\r\n 的区别,在 Difference between \n and \r? (opens new window) 中有这样的示意:

\r = CR (Carriage Return) → Used as a new line character in Mac OS before X \n = LF (Line Feed) → Used as a new line character in Unix/Mac OS X \r\n = CR + LF → Used as a new line character in Windows

简单而言,现在除了 Windows\r\n 作为换行符,其他系统都是把 \n 作为了换行符。那我们有没有一种方法可以 把文件中的不可打印字符显示出来,来确认文件中是以什么换行的

# 试验

首先,先造一个包含两种换行符号的文件 newline.txt

$ echo -e 'LF\nCRLF\r\nEND' > newline.txt
$ cat newline.txt
LF
CRLF
END

使用 cat,它们都会按照换行符进行处理。而在浏览器中也会把它们当做换行符处理

> const o = 'LF\nCRLF\r\nEND'
< "LF
CRLF
END"

# 如何判断文件中的换行符

# vim

vim 中会发现其中蹊跷,:set list

$ vim newline.txt
LF$
CRLF^M$
END$

# cat

cat -e 代表显示不可打印字符与换行符。

$ cat -e newline.txt
LF$
CRLF^M$
END$

# 终极办法:strace

既然 cat 会把文件内容打印到终端, 那我们直接查看关于到标准输出 (FD 为1) 的系统调用 write 就能从最根源上解决问题。

$ strace -e write cat newline.txt
write(1, "LF\nCRLF\r\nEND\n", 13LF
CRLF
END
)       = 13
+++ exited with 0 +++
Last Updated: 2/13/2020, 1:23:11 PM