LoginSignup
0
0

More than 1 year has passed since last update.

【じぶんメモ】シェルスクリプトで日本語ワードをエンコードする

Last updated at Posted at 2022-04-29

Alfredのワークフローで遊んでいます。スクリプトにzshを利用しているのですが、シェルスクリプト初心者なので自分のためにメモを残します

やりたいこと

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

まず、こちらを見てください
価格コム人気検索ワード

現在「定番の人気キーワード」の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コマンドが入っていなかったのでインストールを実施しました
こちらも、やりかたはインターネットでいくつも公開されていますので参考にしてください

では実験です

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

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

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%81%40%8C%8C%88%B3
%83X%83%7d%81%5b%83g%83E%83H%83b%83%60+%8C%8C%88%B3

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

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

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オプションをつける必要がありますのでご注意を

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と併せて入力のプロンプトができます

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

URLにアクセスする

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

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

雑談

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

echo '12345678901234567890' | 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オプションで指定できるようですが、デフォルトが最大のようです

# fオプションを10にした場合
echo '12345678901234567890' | 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 '12345678901234567890' | 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 '12345678901234567890' | 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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0