Skip to content

curl 下载文件乱码问题

问题场景

当你使用 curl 命令下载 CSV 等数据文件时,可能会遇到下载的文件在 Excel 中打开显示乱码或包含未知字符的情况,而通过浏览器直接下载却可以正常打开。

问题原因

根本问题在于 URL 中包含特殊字符 &

bash
curl --output /home/../test2.csv https://example.com/xxx/download?path=yyy&files=zzz.csv

在 Shell 环境中,& 符号有特殊含义——它会将当前命令放入后台运行,并立即执行后续命令。这会导致:

  1. curl 实际只获取了 & 符号前的 URL 片段:https://example.com/xxx/download?path=yyy
  2. 服务器接收到不完整的请求,返回错误页面或部分内容
  3. files=zzz.csv 部分被 Shell 解释为独立命令
  4. 最终下载的文件不是目标 CSV,而是错误响应或截断内容

解决方案

方法:使用引号包裹 URL(推荐)

bash
# 双引号方案(支持变量扩展)
curl --output test.csv "https://example.com/xxx/download?path=yyy&files=zzz.csv"

# 单引号方案(更安全,防变量误解析)
curl --output test.csv 'https://example.com/xxx/download?path=yyy&files=zzz.csv'

关键说明:

  1. 引号强制 Shell 将整个 URL 识别为单一参数
  2. 所有特殊字符(&, ?, ; 等)会被保留原义
  3. 使用实际 URL 替换示例链接

对于提问中的具体案例:

bash
curl --output /home/../test2.csv "https://cloudstor.aarnet.edu.au/plus/s/2DhnLGDdEECo4ys/download?path=%2FUNSW-NB15%20-%20CSV%20Files&files=UNSW-NB15_1.csv"

防御性编程技巧

  • 始终封装原则:即使 URL 当前不含特殊字符,也建议始终添加引号
  • 优先单引号:当 URL 含 $ 符号等需防误解析时(如:file=$name.csv),使用单引号更安全
  • 复制可靠性:从浏览器地址栏复制 URL 时,确保完整复制(右键→复制链接地址

验证下载完整性

执行成功后,可通过以下命令验证:

bash
# 查看文件类型
file test.csv

# 检查CSV文件头部内容
head -n 3 test.csv

预期出现类似结果(而非HTML内容):

"id","duration","protocol",...
1,0,"tcp",...
2,0,"udp",...

扩展知识:其他相关故障排除

案例1:跟随重定向

bash
# 添加 -L 参数跟踪重定向
curl -L -o filename.csv "原始URL含特殊字符"

案例2:处理SSL证书异常

bash
# 忽略SSL校验(仅用于测试环境)
curl -k -o file.csv "https://..."

# 指定自定义证书
curl --cacert /path/to/cert.pem -o file.csv "https://..."

案例3:大文件断点续传

bash
# 支持断点续传
curl -C - -o largefile.zip "下载URL"