什么是CRLF

CRLF, LF 是用来表示文本换行的方式。CR(Carriage Return) 代表回车,对应字符
'\r'
;LF(Line Feed) 代表换行,对应字符
'\n'
。由于历史原因,不同的操作系统文本使用的换行符各不相同。主流的操作系统一般使用CRLF或者LF作为其文本的换行符。其中,Windows 系统使用的是 CRLF, Unix系统(包括Linux, MacOS近些年的版本) 使用的是LF。
系统间的这个差异给跨平台协作开发和跨平台运行带来很多不方便的地方。最近写的代码就遇到了这个问题。下面是一段按行读取配置文件的 Golang 代码,在读取一行字符之后,去掉开头结尾的换行符与空格。我是这样写的: 
fun InterpretQueryLine(data []byte) {
str_line := strings.Trim(string(data), " \n")
// ...
}

本来在自己的 Ubuntu 系统上跑的很好,觉得没bug就提交了。然而,同事使用的是Windows系统,他编译之后怎么跑都不正常。由于我对 Golang 不熟悉,调试了很久才发现是换行符的问题。在Windows系统上换行符是CRLF,
\r\n
两个字符,只删除
\n
是不够的。所以在读取文件的时候一定要小心跨平台。
除了上面的问题,我们平常受到换行符问题的困扰更多来自协作开发工具,比如Git。有时候我们只改了源码中的一行,但提交的时候发现整个文件都被修改了。有时候拉取最新的分支,明明改动不大,但是在与本地合并的时候整个文件都是冲突。这些问题不会导致严重的错误,但是会给开发带来非常大的不方便。
已邀请:

要回复问题请先登录注册