シェルスクリプトで日本語ワードをエンコードする

:::note info
Alfredのワークフローなどで、スクリプトにzshをはじめました。初心者用にメモを残します
:::

# やりたいこと

価格コムの検索（検索結果URLを組み立てる）
と、書いてもなんだかわからないでしょう。alfredのワークフローの習作として試したものです
シェルスクリプトのエッセンスをこの記事に残しておきます

まず、こちらを見てください
[価格コム人気検索ワード](https://kakaku.com/keyword/)

現在「定番の人気キーワード」の1位は、「スマートウォッチ　血圧」となっています
さらにクリックしてみましょう（執筆当時）

そのキーワードでの検索結果が表示されますがURLをみると
https://kakaku.com/search_results/%83X%83%7d%81%5b%83g%83E%83H%83b%83%60+%8C%8C%88%B3/
となっています

よくURLを見る人はピンとくるかもしれません
％ほにゃほにゃは、日本語をコード化したものです
先頭の```https://kakaku.com/search_results/```というのは、その名称から検索結果のURLと推測できます
ということは、価格コムのトップページの検索ボックスを使わなくても、URLの指定で検索ができそうですね
そこで、ソースコーディングでURLを組み立てる！という欲求が生まれるのです

初めに書いたやりたいことというのは、ひらべったくいうと
「スマートウォッチ　血圧」という入力から、
```https://kakaku.com/search_results/%83X%83%7d%81%5b%83g%83E%83H%83b%83%60+%8C%8C%88%B3/```というURLにアクセスするとコードを作るということです

# エンコードの内容を確認する

まず、文字コードといってもいくつかの規格があるので、％ほにゃほにゃが、どのコードなのか特定しましょう
インターネット上には、貼り付けるだけでデコードしてくれるツールがあるので色々試してみてください
ちなみに、日本語（文字）を文字コードに変換することをエンコード、
文字コードを日本語（文字）に復元することをデコードといいます

結局s-jisのようですね


# コード変換を行う（nkf、tr、sed）

シェルスクリプトでコード変換を行うのはnkfコマンドです
私のmacにはnkfコマンドが入っていなかったのでインストールを実施しました
こちらも、やりかたはインターネットでいくつも公開されていますので参考にしてください

では実験です
```zsh
echo 'スマートウォッチ　血圧' | nkf  -WsMQ
 #=> =83X=83=7D=81=5B=83g=83E=83H=83b=83=60=81=40=8C=8C=88=B3
```

イコール区切りなので、％に変換させましょう。trコマンドです

```zsh
echo 'スマートウォッチ　血圧' | nkf  -WsMQ | tr = %
 #=> %83X%83%7D%81%5B%83g%83E%83H%83b%83%60%81%40%8C%8C%88%B3
```

URLのエンコード部分と比べると、違いがあります
%83X%83%7D%81%5B%83g%83E%83H%83b%83%60<font color=red>%81%40</font>%8C%8C%88%B3
%83X%83%7d%81%5b%83g%83E%83H%83b%83%60<font color=red>+</font>%8C%8C%88%B3

検索キーワードの区切りである全角スペースが、nkfでは%81%40というコードですが、
URLでは"＋"となっています

こちらも置換しましょう。複数文字パターンの置換なのでsedを使います

```zsh
echo 'スマートウォッチ　血圧' | nkf  -WsMQ | tr = %　 | sed s/%81%40/+/g 
 #=> %83X%83%7D%81%5B%83g%83E%83H%83b%83%60+%8C%8C%88%B3
```

これで良さそうですね
どうでもいいのですけど、trとsedの2つの置換を、1つのsedにまとめてみました。
-eオプションを使います
1つ目の変換パラメータの前にも-eオプションをつける必要がありますのでご注意を

```zsh
echo 'スマートウォッチ　血圧' | nkf  -WsMQ | sed -e 's/=/%/g' -e 's/%81%40/+/g' 
 #=> %83X%83%7D%81%5B%83g%83E%83H%83b%83%60+%8C%8C%88%B3
```

# キーボード入力を行う

	
キーボードからの入力はreadで可能です。echoと併せて入力のプロンプトができます

```zsh
echo '入力してください'; read kw; echo '入力文字：'$kw
 #=> 入力してください
 #=> スマートウォッチ　血圧
 #=> 入力文字：スマートウォッチ　血圧
```

# URLにアクセスする

URLへのアクセスはopenコマンドを使います
エンコード部分はURL固定部分の後に、echoで出力して連結しています
こちらができあがりです

```zsh
echo '価格コムの検索キーワードを入力してね'; read kw; open "https://kakaku.com/search_results/"`echo  $kw | nkf -WsMQ | sed -e 's/=/%/g' -e 's/%81%40/+/g'`;

```



# 雑談

検索文字が長いとnfkで整形されてしまうようです
上記の価格コムの場合だと、URLがエラーとなってしまいます
いまのところ対処がわかりません

```zsh
echo '１２３４５６７８９０１２３４５６７８９０' | nkf  -WsMQ | sed -e 's/=/%/g' -e 's/%81%40/+/g'
 #=> %82P%82Q%82R%82S%82T%82U%82V%82W%82X%82O%82P%82Q%82R%82S%82T%82U%82V%82W%
 #=> %82X%82O

```

fオプションで指定できるようですが、デフォルトが最大のようです

```zsh
# fオプションを10にした場合
echo '１２３４５６７８９０１２３４５６７８９０' | nkf -f10 -WsMQ | sed -e 's/=/%/g' -e 's/%81%40/+/g'
 #=> %82P%82Q%82R%82S%82T
 #=> %82U%82V%82W%82X%82O
 #=> %82P%82Q%82R%82S%82T
 #=> %82U%82V%82W%82X%82O

# fオプションを60にした場合（デフォルト）
echo '１２３４５６７８９０１２３４５６７８９０' | nkf -f60 -WsMQ | sed -e 's/=/%/g' -e 's/%81%40/+/g'
 #=> %82P%82Q%82R%82S%82T%82U%82V%82W%82X%82O%82P%82Q%82R%82S%82T%82U%82V%82W%
 #=> %82X%82O

# fオプションを100にした場合
echo '１２３４５６７８９０１２３４５６７８９０' | nkf -f100 -WsMQ | sed -e 's/=/%/g' -e 's/%81%40/+/g'
 #=> %82P%82Q%82R%82S%82T%82U%82V%82W%82X%82O%82P%82Q%82R%82S%82T%82U%82V%82W%
 #=> %82X%82O

```