# レスポンスをURLデコードしたい
$ curl {URL} | nkf -w --url-input
# レスポンスをUnicodeデコードしたい
$ curl {URL} | sed 's/\\\u\(....\)/\&#x\1;/g' | nkf -w --numchar-input
nkfのオプション | 意味 |
---|---|
-w | UTF-8コードを出力する |
--url-input | URLデコードする |
--numchar-input | Unicodeをデコードする |
curlのレスポンスが読めない
- 環境
- macOS BigSur バージョン11.1
- nkf : Network Kanji Filter Version 2.1.5
ことの発端は、政府統計の総合窓口(e-Stat)のAPIを使おうとた。
とりあえずcurlしてみた。
読めない!
アプリケーションIDが「hoge」だから認証エラーになっているはずだが、読めない!これじゃエラーじゃなくなっても読めない!
$ curl -X GET -H 'Content-Type:application/json;charset=utf-8' http://api.e-stat.go.jp/rest/3.0/app/json/getStatsList?appId=hoge
{"GET_STATS_LIST":{"RESULT":{"STATUS":100,"ERROR_MSG":"\u8A8D\u8A3C\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3ID\u3092\u78BA\u8A8D\u3057\u3066\u4E0B\u3055\u3044\u3002","DATE":"2021-02-10T21:15:32.959+09:00"},"PARAMETER":{"DATA_FORMAT":"J"}}}%
URLデコードしたら・・・読めなかった
URLの16進数みたいなのとUnicodeがいつもごちゃごちゃな私。
$ curl -X GET -H 'Content-Type:application/json;charset=utf-8' http://api.e-stat.go.jp/rest/3.0/app/json/getStatsList?appId=hoge | nkf -w --url-input
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 294 100 294 0 0 6000 0 --:--:-- --:--:-- --:--:-- 6000
{"GET_STATS_LIST":{"RESULT":{"STATUS":100,"ERROR_MSG":"\u8A8D\u8A3C\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3ID\u3092\u78BA\u8A8D\u3057\u3066\u4E0B\u3055\u3044\u3002","DATE":"2021-02-10T21:40:47.941+09:00"},"PARAMETER":{"DATA_FORMAT":"J"}}}%
レスポンスはUnicodeだった・・・
Unicodeでデコードしても読めない!
$ curl -X GET -H 'Content-Type:application/json;charset=utf-8' http://api.e-stat.go.jp/rest/3.0/app/json/getStatsList?appId=hoge | nkf -w --numchar-input
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 294 100 294 0 0 3585 0 --:--:-- --:--:-- --:--:-- 3542
{"GET_STATS_LIST":{"RESULT":{"STATUS":100,"ERROR_MSG":"\u8A8D\u8A3C\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3ID\u3092\u78BA\u8A8D\u3057\u3066\u4E0B\u3055\u3044\u3002","DATE":"2021-02-10T21:53:55.930+09:00"},"PARAMETER":{"DATA_FORMAT":"J"}}}%
あぁ!&#
始まりで';'終わりじゃなきゃだめなのか!
--cap-input, --url-input
それぞれ :、% に続く 16 進数を文字に変換する
--numchar-input
&#....; のような Unicode 文字参照を変換する
nkf - コマンド (プログラム) の説明 - Linux コマンド集 一覧表
\u
を&#
と;
に置換するのエスケープ多くて面倒だなぁと思ったら素敵な答えがあった。感謝です。
sed 's/\\\u\(....\)/\&#x\1;/g' | nkf --numchar-input -w
【5秒で使える小ネタ】Unicodeエスケープされた文字列をデコードする - Qiita
$ curl -X GET -H 'Content-Type:application/json;charset=utf-8' http://api.e-stat.go.jp/rest/3.0/app/json/getStatsList?appId=hoge | sed 's/\\\u\(....\)/\&#x\1;/g' | nkf -w --numchar-input
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 294 100 294 0 0 5157 0 --:--:-- --:--:-- --:--:-- 5157
{"GET_STATS_LIST":{"RESULT":{"STATUS":100,"ERROR_MSG":"認証に失敗しました。アプリケーションIDを確認して下さい。","DATE":"2021-02-10T22:06:13.754+09:00"},"PARAMETER":{"DATA_FORMAT":"J"}}}%
そもそもcurlでそんなに頑張らなくてもPostmanかなんか使えばいいんだけどね。これもお勉強です。