换行符LF和CRLF的区别

6 次阅读

本文最后更新于 2026年8月29日。

LF 与 CRLF 换行符区别

LF:\n 0x0A
CRLF:\r\n 0x0D 0x0A

  • CR = Carriage Return 回车 \r(0x0D):光标回到行首
  • LF = Line Feed 换行 \n(0x0A):光标下移一行

各系统默认换行

系统 换行符 说明
Linux / macOS(OS X以后) LF (\n) 只有换行,没有回车
Windows CRLF (\r\n) 先回车回到行首,再向下换行
老Mac OS 9及以前 CR (\r) 现在基本绝迹

实际遇到的问题

1. Git 跨平台坑

Windows git 默认会自动转换:提交存LF,拉到本地变成CRLF。
会出现:脚本在Linux执行报错、diff看到整行全部变红。

.gitattributes 强制换行:

* text=auto      # 默认,自动转换
*.sh text eol=lf # shell脚本强制LF
*.bat text eol=crlf # bat脚本强制CRLF

2. Shell / Python / 脚本

  • Linux shell脚本如果是CRLF,执行会报 ^M 错误,\r 被当成非法字符。
  • Python:open() 默认会做换行转换;newline='' 关闭自动转换,读取原始字节。
# 读取原始,不自动处理换行
with open("test.txt", "r", newline='') as f:
    data = f.read()

3. 编辑器查看

VS Code右下角会显示 LF / CRLF,点击可以一键切换。

4. 命令行查看换行

# linux/mac 看是否有\r
cat -v file.txt
# ^M 代表 \r

# 转换 CRLF → LF
dos2unix file.txt
# LF → CRLF
unix2dos file.txt

简单记忆

  • LF(\n):Unix/Linux/macOS,网络文本、脚本、代码文件优先用LF
  • CRLF(\r\n):Windows记事本,bat批处理,Windows原生文档

网络协议 HTTP 头部标准规定行结尾必须是 CRLF

常见踩坑小结

  1. Windows写的sh脚本传到Linux,带CRLF,运行报错^M,需要转LF。
  2. Linux写的文本放到旧版Windows记事本,全部挤成一整行(老记事本不识别LF),新版记事本已经支持LF。
  3. Git跨平台开发,换行不一致造成大量无意义diff。