[Watson メモ]

ワトソンメモ


curl で urlencode してquerystring(パラメータ)を送信する場合の注意事項

スポンサーリンク

カテゴリ:curl
対象OS:Windows


例えばGoogle Chrome より以下の URL を入力したとします。

https://<ドメイン名>/パス?text=パスワードが分かりません

この場合、Chromeは "パスワードが分かりません" という文字列を UTF-8として扱い、%エンコードされてサーバに送信されます。
具体的には以下のようにエンコードされます。

https://<ドメイン名>/path?text=%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%81%8C%E5%88%86%E3%81%8B%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93


一方で curl.exe によりWindows の コマンドプロンプトにより以下のコマンドにより get を実行したとします。
curl -verbose -k -G -u "%USERNAME%":"%PASSWORD%" "%APIURL%/%CLASSIFIER_ID%/path" --data-urlencode "text=パスワードが分かりません"

この場合以下のように%エンコードされて送信されます。これはShift-JIS としてエンコードされています。

text=%83%8A%83Z%83b%83g%83p%83X%83%8F%81%5B%83h

サーバ側がUTF-8のみ認識する場合は、上記のWindows からの実行ではエラーとなります。
2016年現在では、コマンドプロンプトはUTF-8を表示することは可能ですが、文字コートとして扱うことは出来ないようです。

(注意)ただし文字列がいわゆる2バイトコードを含まない場合は、Shift-Jisとしてencodeして送信しても問題ないようです。


Windowsで UTF-8 エンコードするには、UTF-8としてテキストファイルを保存し送信する方法が有効です。

--data-urlencodeにパラメータ名@<ファイルパス> という形式で指定します。

例:
curl -verbose -k -G -u "%USERNAME%":"%PASSWORD%" "%APIURL%/%CLASSIFIER_ID%/path" --data-urlencode text@<ファイルパス>

<ファイルパス>には UTF-8で保存したテキストファイルを指定します。(text@c:\temp\question.txtなど)

参考:curl でどのようにエンコードされて送信されているかを標準エラー出力に出力するには、-verbose オプションを使用します。


スポンサーリンク


このページは独学で学習した結果をメモした結果です。内容に不備・誤りがある可能性があります。 また今後仕様が変更となり記述が不正確になる可能性もあります。あくまでも自己責任で本ページを参考にしてください。 本サイト内掲載されている情報は、著作権法により保護されています。いかなる場合でも権利者の許可なくコピー、配布することはできません。