QT中打开Git等代码遇到CRLF与LF格式的问题及解决

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 0A0A
典型系统Windows 操作系统(如 Win10/Win11)Linux、Unix、macOS(macOS X 及之后版本)
编辑器默认记事本等默认保存为 CRLFVim、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
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驯龙高手_追风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值