Skip to content

curlでファイルダウンロード時に文字化けする問題の解決法

問題点

curlコマンドで特定のURLからCSVファイルをダウンロードしようとすると、以下の問題が発生します:

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

ダウンロードしたファイルは:

  • Excelで正常に開けない
  • 文字化けした不可読な状態になる
  • ブラウザから直接ダウンロードした場合には正常に動作する

重要な注意点

この問題の根本原因はダウンロードURLに含まれる &(アンパサンド) 文字です。シェルがこの文字を特殊記号として解釈するため、URLが途中で切断されます。

効果的な解決策

(1) URLを引用符で囲む(推奨)

最も簡単で確実な方法は、URL全体をダブルクォーテーションで囲むことです:

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

技術的な理由

  • & はシェルにおいて「コマンドをバックグラウンドで実行」する記号です
  • 引用符で囲むことで、シェルがその後の文字をコマンドとして解釈するのを防ぎます
  • URL全体を一つの文字列としてcurlに正しく渡せます

(2) URLエスケープを使用する(代替案)

引用符を使用できない場合、&\& でエスケープする方法もあります:

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

補足説明

正しいダウンロードの確認

ダウンロード後、ファイルが正しく取得できたか確認するには:

bash
file test.csv  # ファイルタイプの確認
head test.csv  # 先頭部分のプレビュー

よくあるエラーケース

  • URLを引用符で囲まない場合、シェルは&でコマンドが終了したと判断
  • 実際には以下の部分だけがcurlに渡される:
    bash
    https://cloudstor.aarnet.edu.au/plus/s/2DhnLGDdEECo4ys/download?path=%2FUNSW-NB15%20-%20CSV%20Files
  • サーバーが不完全なリクエストを受け取り、正しくないファイルを返却

応用: 複数ファイルの一括ダウンロード

同様の原理で、複数のファイルをダウンロードする場合:

bash
curl -O "https://example.com/file1?param=value&name=file1.csv" \
     -O "https://example.com/file2?param=value&name=file2.csv"

一般的なベストプラクティス

常にURLは引用符で囲む ことを習慣化しましょう。URLに問題となる文字が含まれていない場合でも、この習慣は安全なコマンド実行に役立ちます:

  • スペースを含むURLで必須
  • ?, &, = などの特殊文字を含むURLで特に重要

引用符でURLを囲むことで、curlは意図した通りのリソースにアクセスすることができ、正しいファイルをダウンロードできるようになります。これにより、ファイルの文字化け問題やExcelでの表示問題は完全に解決されます。