文章目录
1.背景描述
当前Windows系统重QT工程有一批代码,但使用Git工具上传后,代码的CRLF文件全部变成LF格式,导致再下载clone工程时,下载下来的代码是LF格式出现编译错误,错误如下:

2.CRLF与LF格式说明
| 对比维度 | Windows(CRLF) | Linux / Unix / macOS(现代)(LF) |
|---|---|---|
| 换行符名称 | 回车 + 换行(Carriage Return + Line Feed) | 仅换行(Line Feed) |
| 字符组成 | \r(回车) + \n(换行) | \n(换行) |
| ASCII 码 | \r = 13(十六进制 0D),\n = 10(十六进制 0A) | \n = 10(十六进制 0A) |
| 实际表示 | \r\n | ` |
| 十六进制 | 0D 0A | 0A |
| 典型系统 | Windows 操作系统(如 Win10/Win11) | Linux、Unix、macOS(macOS X 及之后版本) |
| 编辑器默认 | 记事本等默认保存为 CRLF | Vim、VS Code、Nano 等默认使用 LF |
| 常见问题 | 在 Linux 下可能显示 ^M(即 \r) | 在 Windows 记事本中可能不自动换行 |
| 脚本兼容性 | 含 \r 的脚本在 Linux 可能运行异常 | 纯 \n 格式广泛兼容各类 Unix-like 系统 |
| Git 推荐 | 建议统一转为 LF 避免跨平台问题 | 原生支持 LF,无需额外转换 |
| 转换工具 | unix2dos(转 CRLF)、编辑器手动切换 | dos2unix(转 LF)、编辑器手动切换 |
3.文件格式转换工具dos2unix介绍

dos2unix(下载地址:dos2unix官网下载)是一款跨平台文本文件格式转换工具,主要用于解决Windows与Unix/Linux/Mac系统间换行符差异问题(Windows使用CRLF(\r\n),Unix/Linux使用LF(\n))。此外,部分版本还支持字符编码转换(如UTF-16转UTF-8),帮助用户在不同系统间无缝处理文本文件,避免因格式不兼容导致的脚本执行错误、文本编辑异常等问题。
| 功能类别 | 具体功能 | 说明 |
|---|---|---|
| 核心换行符转换 | Windows格式(CRLF)→ Unix格式(LF) | 将Windows系统中的CRLF换行符替换为Unix/Linux系统的LF,确保文本文件在Unix环境下正确显示和执行。 |
| 格式转换 | Unix格式(LF)→ Windows格式(CRLF)(通过unix2dos工具实现) | 将Unix/Linux系统中的LF换行符替换为Windows系统的CRLF,适配Windows应用的文本格式要求。 |
| 字符编码转换 | 支持UTF-16→UTF-8、Windows编码页(如1252)→Unix Latin-1等 | 将Windows系统中的编码格式(如UTF-16)转换为Unix/Linux常用的UTF-8或Latin-1,解决跨系统文本乱码问题。 |
| 文件安全保护 | 保留原始文件时间戳(-k)、跳过二进制文件(-s)、强制转换(-f) | -k:转换后保留文件的原始修改时间,避免版本控制混乱;-s:自动跳过二进制文件(如.exe、.dll),防止误转换导致文件损坏;-f:强制转换二进制文件(需谨慎使用)。 |
dos2unix的使用文档见官方链接:dos2unix中文使用说明
3.1Windows中Unicode文件的文件名
dos2unix对于Windows命令提示符中读取和写入Unicode文件名有额外的支持。这意味着dos2unix可以打开那些包含非默认系统ANSI编码页字符的文件。若要查看Windows版dos2unix在编译时是否加入了Unicode文件名支持,请输入 dos2unix -V。
在Windows终端中显示Unicode文件名有一些需要注意的问题。请参见 -D 和 --display-enc 选项。文件名在终端中可能无法被正确显示,但写入文件时文件名仍然是正确的。
Unicode示例
转换Windows UTF-16到Unix UTF-8:
dos2unix -n in.txt out.txt
转换Windows UTF-16LE(不含BOM)到Unix UTF-8:
dos2unix -ul -n in.txt out.txt
转换Unix UTF-8到Windows UTF-8(并添加BOM):
unix2dos -m -n in.txt out.txt
转换Unix UTF-8到Windows UTF-16:
unix2dos < in.txt | iconv -f UTF-8 -t UTF-16 > out.txt
从标准输入读取,并输出到标准输出:
dos2unix < a.txt
cat a.txt | dos2unix
转换并覆盖a.txt和b.txt:
dos2unix a.txt b.txt
dos2unix -o a.txt b.txt
转换并覆盖a.txt,使用ascii模式:
dos2unix a.txt
转换并覆盖a.txt,使用ascii模式;转换并覆盖b.txt,使用7位编码模式:
dos2unix a.txt -c 7bit b.txt
dos2unix -c ascii a.txt -c 7bit b.txt
dos2unix -ascii a.txt -7 b.txt
将a.txt从Mac格式转换到Unix格式:
dos2unix -c mac a.txt
mac2unix a.txt
将a.txt从Unix格式转换到Mac格式:
unix2dos -c mac a.txt
unix2mac a.txt
转换并覆盖a.txt,保留原始时间戳:
dos2unix -k a.txt
dos2unix -k -o a.txt
转换a.txt,并输出到e.txt:
dos2unix -n a.txt e.txt
转换a.txt,并输出到e.txt,同时使e.txt的时间戳和a.txt一致:
dos2unix -k -n a.txt e.txt
转换并覆盖a.txt;转换b.txt并输出到e.txt:
dos2unix a.txt -n b.txt e.txt
dos2unix -o a.txt -n b.txt e.txt
转换c.txt并输出到e.txt;转换并覆盖a.txt和b.txt;转换d.txt并输出到f.txt:
dos2unix -n c.txt e.txt -o a.txt b.txt -n d.txt f.txt
3.2 递归转换
结合 find(1) 和 xargs(1) 使用 dos2unix 可以递归地转换目录树中的文本文件。例如,转换当前目录的目录树中所有的 .txt 文件:
dos2unix < a.txt
cat a.txt | dos2unix
若文件名中有空格或引号,则需要使用 find(1) 选项 -print0 及相应的 xargs(1) 选项 -0;其他情况下则可以省略它们。也可以结合 -exec 选项来使用 find(1):
find . -name '*.txt' -exec dos2unix {} \;
在Windows命令提示符中,可以使用下列命令:
for /R %G in (*.txt) do dos2unix "%G"
PowerShell用户可以在Windows PowerShell中使用如下命令:
get-childitem -path . -filter '*.txt' -recurse | foreach-object {dos2unix $_.Fullname}
4.代码转换案例
本次采用Windows控制台的dos2unix递归转换策略。
4.1 打开目录下的控制台

4.2 输入递归转换指令
(1)如果是Linux→Windows转换:
for /R %G in (*.cpp *.h *.c) do unix2dos "%G"
(2)如果是Windows→Linux转换:
for /R %G in (*.cpp *.h *.c) do dos2unix "%G"
如果出现以下画面,说明程序已经在批量转换了

转换完成后,即可实现代码的批量换行符转换,编译即可通过。
END


900

被折叠的 条评论
为什么被折叠?



