curlのレスポンスをデコードする


```zsh
# レスポンスを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」だから認証エラーになっているはずだが、読めない！これじゃエラーじゃなくなっても読めない！

```zsh
$ 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がいつもごちゃごちゃな私。

```zsh
$ 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でデコードしても読めない！

```zsh
$ 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 コマンド集 一覧表](https://kazmax.zpp.jp/cmd/n/nkf.1.html)

`\u`を`&#`と`;`に置換するのエスケープ多くて面倒だなぁと思ったら素敵な答えがあった。感謝です。
> `sed 's/\\\u\(....\)/\&#x\1;/g' | nkf --numchar-input -w`
> [【5秒で使える小ネタ】Unicodeエスケープされた文字列をデコードする - Qiita](https://qiita.com/m_kawaguchi/items/3feaeab510508740c530)

```zsh
$ 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かなんか使えばいいんだけどね。これもお勉強です。