本文最后更新于 2026年8月29日。
LF 与 CRLF 换行符区别
LF:
\n0x0A
CRLF:\r\n0x0D 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。
常见踩坑小结
- Windows写的sh脚本传到Linux,带CRLF,运行报错
^M,需要转LF。 - Linux写的文本放到旧版Windows记事本,全部挤成一整行(老记事本不识别LF),新版记事本已经支持LF。
- Git跨平台开发,换行不一致造成大量无意义diff。